From cc2c48d59e3d5944134b0b3d1ddbd3fc5d728791 Mon Sep 17 00:00:00 2001 From: Shardul Natu <43422294+kiranani@users.noreply.github.com> Date: Tue, 11 Nov 2025 10:19:06 -0800 Subject: [PATCH] fix(extension-uninstallation): Fix uninstalling extensions named differently than their directory name (#12852) Co-authored-by: Shnatu --- packages/cli/src/config/extension-manager.ts | 6 ++++- packages/cli/src/config/extension.test.ts | 28 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/config/extension-manager.ts b/packages/cli/src/config/extension-manager.ts index cc2388585e..610716cdc3 100644 --- a/packages/cli/src/config/extension-manager.ts +++ b/packages/cli/src/config/extension-manager.ts @@ -390,7 +390,11 @@ export class ExtensionManager extends ExtensionLoader { throw new Error(`Extension not found.`); } await this.unloadExtension(extension); - const storage = new ExtensionStorage(extension.name); + const storage = new ExtensionStorage( + extension.installMetadata?.type === 'link' + ? extension.name + : path.basename(extension.path), + ); await fs.promises.rm(storage.getExtensionDir(), { recursive: true, diff --git a/packages/cli/src/config/extension.test.ts b/packages/cli/src/config/extension.test.ts index c762dd3295..3220e763d5 100644 --- a/packages/cli/src/config/extension.test.ts +++ b/packages/cli/src/config/extension.test.ts @@ -1555,6 +1555,34 @@ This extension will run the following MCP servers: expect(fs.existsSync(otherExtDir)).toBe(true); }); + it('should uninstall an extension on non-matching extension directory name', async () => { + // Create an extension with a name that differs from the directory name. + const sourceExtDir = createExtension({ + extensionsDir: userExtensionsDir, + name: 'My-Local-Extension', + version: '1.0.0', + }); + const newSourceExtDir = path.join( + userExtensionsDir, + 'my-local-extension', + ); + fs.renameSync(sourceExtDir, newSourceExtDir); + + const otherExtDir = createExtension({ + extensionsDir: userExtensionsDir, + name: 'other-extension', + version: '1.0.0', + }); + + await extensionManager.loadExtensions(); + await extensionManager.uninstallExtension('my-local-extension', false); + + expect(fs.existsSync(sourceExtDir)).toBe(false); + expect(fs.existsSync(newSourceExtDir)).toBe(false); + expect(extensionManager.getExtensions()).toHaveLength(1); + expect(fs.existsSync(otherExtDir)).toBe(true); + }); + it('should throw an error if the extension does not exist', async () => { await extensionManager.loadExtensions(); await expect(