diff --git a/packages/core/src/extension/extensionManager.test.ts b/packages/core/src/extension/extensionManager.test.ts index 10a39dc5e..7b43eddc7 100644 --- a/packages/core/src/extension/extensionManager.test.ts +++ b/packages/core/src/extension/extensionManager.test.ts @@ -755,6 +755,20 @@ describe('extension tests', () => { const id = getExtensionId(config, metadata); expect(id).toBe(hashValue('https://github.com/owner/repo')); }); + + it('should use source as-is for non-GitHub git URLs (e.g., GitLab)', () => { + // For non-GitHub git servers, fall back to using the source URL directly + const config: ExtensionConfig = { name: 'test-ext', version: '1.0.0' }; + const metadata = { + type: 'git' as const, + source: 'https://gitlab.company.com/team/extension-repo', + }; + + const id = getExtensionId(config, metadata); + expect(id).toBe( + hashValue('https://gitlab.company.com/team/extension-repo'), + ); + }); }); }); diff --git a/packages/core/src/extension/extensionManager.ts b/packages/core/src/extension/extensionManager.ts index 15ead552d..e64527ced 100644 --- a/packages/core/src/extension/extensionManager.ts +++ b/packages/core/src/extension/extensionManager.ts @@ -1358,12 +1358,18 @@ export function getExtensionId( installMetadata?: ExtensionInstallMetadata, ): string { let idValue = config.name; - const githubUrlParts = + let githubUrlParts = null; + if ( installMetadata && (installMetadata.type === 'git' || installMetadata.type === 'github-release') - ? parseGitHubRepoForReleases(installMetadata.source) - : null; + ) { + try { + githubUrlParts = parseGitHubRepoForReleases(installMetadata.source); + } catch { + // Non-GitHub URL (GitLab, Bitbucket, etc.) - use source as-is + } + } if (githubUrlParts) { idValue = `https://github.com/${githubUrlParts.owner}/${githubUrlParts.repo}`; } else {