From 6e55df9bed14d957566df5c5adc09bbd755224d7 Mon Sep 17 00:00:00 2001 From: Serhii Dziupin Date: Thu, 13 Aug 2026 16:08:28 +0300 Subject: [PATCH] feat(integrations): point third-party plugins at OpenChamber packages --- .../integrations/thirdPartyPlugins.test.ts | 28 +++++++++++++++++-- .../integrations/thirdPartyPlugins.ts | 12 ++++---- packages/ui/src/lib/settings/search.test.ts | 11 ++++++++ packages/ui/src/lib/settings/search.ts | 6 ++-- 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/packages/ui/src/components/sections/integrations/thirdPartyPlugins.test.ts b/packages/ui/src/components/sections/integrations/thirdPartyPlugins.test.ts index ba82ed3d..35dc0846 100644 --- a/packages/ui/src/components/sections/integrations/thirdPartyPlugins.test.ts +++ b/packages/ui/src/components/sections/integrations/thirdPartyPlugins.test.ts @@ -37,7 +37,7 @@ const getCatalogPluginPresentation = ( } ).getCatalogPluginPresentation; -const claudePackage = '@otto-assistant/opencode-claude'; +const claudePackage = '@openchamber/opencode-claude'; const entry = (spec: string, scope: PluginEntry['scope'] = 'user'): PluginEntry => ({ id: `config:${scope}:${spec}`, @@ -117,7 +117,31 @@ describe('third-party plugin catalog helpers', () => { test('matches only a package or its versioned spec', () => { expect(specMatchesPackage(claudePackage, claudePackage)).toBe(true); expect(specMatchesPackage(`${claudePackage}@0.6.0`, claudePackage)).toBe(true); - expect(specMatchesPackage('@otto-assistant/opencode-claude-extra@0.6.0', claudePackage)).toBe(false); + expect(specMatchesPackage('@openchamber/opencode-claude-extra@0.6.0', claudePackage)).toBe(false); + }); + + test('points catalog plugins at the OpenChamber GitHub and npm packages', () => { + expect(thirdPartyCatalog.THIRD_PARTY_PLUGINS.map((plugin) => ({ + id: plugin.id, + packageName: plugin.packageName, + homepage: plugin.homepage, + }))).toEqual([ + { + id: 'opencode-claude', + packageName: '@openchamber/opencode-claude', + homepage: 'https://github.com/openchamber/opencode-claude', + }, + { + id: 'opencode-commandcode', + packageName: '@openchamber/opencode-commandcode', + homepage: 'https://github.com/openchamber/opencode-commandcode', + }, + { + id: 'opencode-cursor-oauth', + packageName: '@openchamber/opencode-cursor', + homepage: 'https://github.com/openchamber/opencode-cursor', + }, + ]); }); test('uses the configured user entry and its registry result', () => { diff --git a/packages/ui/src/components/sections/integrations/thirdPartyPlugins.ts b/packages/ui/src/components/sections/integrations/thirdPartyPlugins.ts index ff28c43e..ecbf1bba 100644 --- a/packages/ui/src/components/sections/integrations/thirdPartyPlugins.ts +++ b/packages/ui/src/components/sections/integrations/thirdPartyPlugins.ts @@ -17,33 +17,33 @@ export interface ThirdPartyPluginDefinition { export const THIRD_PARTY_PLUGINS: readonly ThirdPartyPluginDefinition[] = [ { id: 'opencode-claude', - packageName: '@otto-assistant/opencode-claude', + packageName: '@openchamber/opencode-claude', providerId: 'claude-code', icon: 'claude-code', brandClassName: 'text-[#D97757]', nameKey: 'settings.integrations.thirdParty.opencodeClaude.name', descriptionKey: 'settings.integrations.thirdParty.opencodeClaude.description', - homepage: 'https://github.com/otto-assistant/opencode-claude', + homepage: 'https://github.com/openchamber/opencode-claude', }, { id: 'opencode-commandcode', - packageName: '@otto-assistant/opencode-commandcode', + packageName: '@openchamber/opencode-commandcode', providerId: 'command-code', icon: 'command-code', brandClassName: 'text-foreground', nameKey: 'settings.integrations.thirdParty.opencodeCommandcode.name', descriptionKey: 'settings.integrations.thirdParty.opencodeCommandcode.description', - homepage: 'https://github.com/otto-assistant/opencode-commandcode', + homepage: 'https://github.com/openchamber/opencode-commandcode', }, { id: 'opencode-cursor-oauth', - packageName: '@otto-assistant/opencode-cursor-oauth', + packageName: '@openchamber/opencode-cursor', providerId: 'cursor', icon: 'cursor', brandClassName: 'text-foreground', nameKey: 'settings.integrations.thirdParty.opencodeCursorOauth.name', descriptionKey: 'settings.integrations.thirdParty.opencodeCursorOauth.description', - homepage: 'https://github.com/otto-assistant/opencode-cursor', + homepage: 'https://github.com/openchamber/opencode-cursor', }, ] as const; diff --git a/packages/ui/src/lib/settings/search.test.ts b/packages/ui/src/lib/settings/search.test.ts index 95491d6b..47c0f2a2 100644 --- a/packages/ui/src/lib/settings/search.test.ts +++ b/packages/ui/src/lib/settings/search.test.ts @@ -28,6 +28,17 @@ describe('settings search', () => { expect(results.some((result) => result.id === 'integrations.third-party.opencode-claude')).toBe(true); }); + test('finds third-party integrations by OpenChamber npm package names', () => { + const results = buildSettingsSearchResults({ + query: '@openchamber/opencode-cursor', + runtimeCtx, + t, + getPageTitle: (page) => page, + }); + + expect(results.some((result) => result.id === 'integrations.third-party.opencode-cursor-oauth')).toBe(true); + }); + test('finds coming-soon messenger placeholders', () => { const results = buildSettingsSearchResults({ query: 'discord', diff --git a/packages/ui/src/lib/settings/search.ts b/packages/ui/src/lib/settings/search.ts index aca6dfd5..2dba4ed1 100644 --- a/packages/ui/src/lib/settings/search.ts +++ b/packages/ui/src/lib/settings/search.ts @@ -965,21 +965,21 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [ page: 'integrations', titleKey: 'settings.integrations.thirdParty.opencodeClaude.name', descriptionKey: 'settings.integrations.thirdParty.opencodeClaude.description', - keywords: ['claude', 'anthropic', 'claude code', 'pro', 'max', 'agent sdk'], + keywords: ['claude', 'anthropic', 'claude code', 'pro', 'max', 'agent sdk', '@openchamber/opencode-claude'], }, { id: 'integrations.third-party.opencode-commandcode', page: 'integrations', titleKey: 'settings.integrations.thirdParty.opencodeCommandcode.name', descriptionKey: 'settings.integrations.thirdParty.opencodeCommandcode.description', - keywords: ['command code', 'commandcode', 'laguna', 'poolside', 'gateway'], + keywords: ['command code', 'commandcode', 'laguna', 'poolside', 'gateway', '@openchamber/opencode-commandcode'], }, { id: 'integrations.third-party.opencode-cursor-oauth', page: 'integrations', titleKey: 'settings.integrations.thirdParty.opencodeCursorOauth.name', descriptionKey: 'settings.integrations.thirdParty.opencodeCursorOauth.description', - keywords: ['cursor', 'oauth', 'subscription', 'openai compatible'], + keywords: ['cursor', 'oauth', 'subscription', 'openai compatible', '@openchamber/opencode-cursor'], }, ] as const;