From 2cf3a14439da1dd24ab31bdf1a45d67d83391d03 Mon Sep 17 00:00:00 2001 From: christine betts Date: Tue, 3 Feb 2026 15:31:14 -0500 Subject: [PATCH] Reload skills when extensions change (#18225) --- .../cli/src/config/extension-manager-themes.spec.ts | 2 ++ packages/core/src/utils/extensionLoader.test.ts | 10 ++++++++++ packages/core/src/utils/extensionLoader.ts | 1 + 3 files changed, 13 insertions(+) diff --git a/packages/cli/src/config/extension-manager-themes.spec.ts b/packages/cli/src/config/extension-manager-themes.spec.ts index f48daeaee0..29588c8749 100644 --- a/packages/cli/src/config/extension-manager-themes.spec.ts +++ b/packages/cli/src/config/extension-manager-themes.spec.ts @@ -133,6 +133,7 @@ describe('ExtensionManager theme loading', () => { }), isTrustedFolder: () => true, getImportFormat: () => 'tree', + reloadSkills: vi.fn(), } as unknown as Config; await extensionManager.start(mockConfig); @@ -208,6 +209,7 @@ describe('ExtensionManager theme loading', () => { getAgentRegistry: () => ({ reload: vi.fn().mockResolvedValue(undefined), }), + reloadSkills: vi.fn(), } as unknown as Config; await extensionManager.start(mockConfig); diff --git a/packages/core/src/utils/extensionLoader.test.ts b/packages/core/src/utils/extensionLoader.test.ts index 351dc19067..9cbcd51e06 100644 --- a/packages/core/src/utils/extensionLoader.test.ts +++ b/packages/core/src/utils/extensionLoader.test.ts @@ -37,6 +37,7 @@ describe('SimpleExtensionLoader', () => { >; let mockHookSystemInit: MockInstance; let mockAgentRegistryReload: MockInstance; + let mockSkillsReload: MockInstance; const activeExtension: GeminiCLIExtension = { name: 'test-extension', @@ -65,6 +66,7 @@ describe('SimpleExtensionLoader', () => { mockGeminiClientSetTools = vi.fn(); mockHookSystemInit = vi.fn(); mockAgentRegistryReload = vi.fn(); + mockSkillsReload = vi.fn(); mockConfig = { getMcpClientManager: () => mockMcpClientManager, getEnableExtensionReloading: () => extensionReloadingEnabled, @@ -78,6 +80,7 @@ describe('SimpleExtensionLoader', () => { getAgentRegistry: () => ({ reload: mockAgentRegistryReload, }), + reloadSkills: mockSkillsReload, } as unknown as Config; }); @@ -138,17 +141,20 @@ describe('SimpleExtensionLoader', () => { expect(mockHookSystemInit).toHaveBeenCalledOnce(); expect(mockGeminiClientSetTools).toHaveBeenCalledOnce(); expect(mockAgentRegistryReload).toHaveBeenCalledOnce(); + expect(mockSkillsReload).toHaveBeenCalledOnce(); } else { expect(mockMcpClientManager.startExtension).not.toHaveBeenCalled(); expect(mockRefreshServerHierarchicalMemory).not.toHaveBeenCalled(); expect(mockHookSystemInit).not.toHaveBeenCalled(); expect(mockGeminiClientSetTools).not.toHaveBeenCalledOnce(); expect(mockAgentRegistryReload).not.toHaveBeenCalled(); + expect(mockSkillsReload).not.toHaveBeenCalled(); } mockRefreshServerHierarchicalMemory.mockClear(); mockHookSystemInit.mockClear(); mockGeminiClientSetTools.mockClear(); mockAgentRegistryReload.mockClear(); + mockSkillsReload.mockClear(); await loader.unloadExtension(activeExtension); if (reloadingEnabled) { @@ -159,12 +165,14 @@ describe('SimpleExtensionLoader', () => { expect(mockHookSystemInit).toHaveBeenCalledOnce(); expect(mockGeminiClientSetTools).toHaveBeenCalledOnce(); expect(mockAgentRegistryReload).toHaveBeenCalledOnce(); + expect(mockSkillsReload).toHaveBeenCalledOnce(); } else { expect(mockMcpClientManager.stopExtension).not.toHaveBeenCalled(); expect(mockRefreshServerHierarchicalMemory).not.toHaveBeenCalled(); expect(mockHookSystemInit).not.toHaveBeenCalled(); expect(mockGeminiClientSetTools).not.toHaveBeenCalledOnce(); expect(mockAgentRegistryReload).not.toHaveBeenCalled(); + expect(mockSkillsReload).not.toHaveBeenCalled(); } }); @@ -186,6 +194,7 @@ describe('SimpleExtensionLoader', () => { expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce(); expect(mockHookSystemInit).toHaveBeenCalledOnce(); expect(mockAgentRegistryReload).toHaveBeenCalledOnce(); + expect(mockSkillsReload).toHaveBeenCalledOnce(); }, ); }, @@ -201,6 +210,7 @@ describe('SimpleExtensionLoader', () => { await loader.restartExtension(activeExtension); expect(loader.stopExtension).toHaveBeenCalledWith(activeExtension); expect(loader.startExtension).toHaveBeenCalledWith(activeExtension); + expect(mockSkillsReload).toHaveBeenCalledTimes(2); }); }); }); diff --git a/packages/core/src/utils/extensionLoader.ts b/packages/core/src/utils/extensionLoader.ts index 61091ed405..7110ba8615 100644 --- a/packages/core/src/utils/extensionLoader.ts +++ b/packages/core/src/utils/extensionLoader.ts @@ -113,6 +113,7 @@ export abstract class ExtensionLoader { await refreshServerHierarchicalMemory(this.config); await this.config.getHookSystem()?.initialize(); await this.config.getAgentRegistry().reload(); + await this.config.reloadSkills(); } }