Merge pull request #7678 from PMExtra/feat/claude-code-only-client-tabs

feat: Claude Code 专用分组仅展示受支持的客户端入口
This commit is contained in:
Wesley Liddick
2026-09-29 15:53:58 +08:00
committed by GitHub
3 changed files with 45 additions and 1 deletions
+6 -1
View File
@@ -275,6 +275,7 @@ interface Props {
apiKey: string
baseUrl: string
platform: GroupPlatform | null
claudeCodeOnly?: boolean
allowMessagesDispatch?: boolean
}
@@ -336,6 +337,7 @@ const codexManifestContext = computed(() => {
// Reset tabs when platform changes
const defaultClientTab = computed(() => {
if (props.claudeCodeOnly) return 'claude'
switch (props.platform) {
case 'openai':
return 'codex'
@@ -350,7 +352,7 @@ const defaultClientTab = computed(() => {
}
})
watch(() => props.platform, () => {
watch(() => [props.platform, props.claudeCodeOnly], () => {
activeTab.value = 'unix'
activeClientTab.value = defaultClientTab.value
codexAuthMode.value = 'legacy'
@@ -440,6 +442,9 @@ const SparkleIcon = {
const clientTabs = computed((): TabConfig[] => {
if (!props.platform) return []
if (props.claudeCodeOnly) {
return [{ id: 'claude', label: t('keys.useKeyModal.cliTabs.claudeCode'), icon: TerminalIcon }]
}
switch (props.platform) {
case 'openai': {
const tabs: TabConfig[] = [
@@ -40,6 +40,44 @@ describe('UseKeyModal', () => {
saveAsMock.mockClear()
})
it('shows only Claude Code for Claude Code-only groups', async () => {
const wrapper = mount(UseKeyModal, {
props: {
show: true,
apiKey: 'sk-anthropic-test',
baseUrl: 'https://example.com/v1',
platform: 'anthropic'
},
global: {
stubs: {
BaseDialog: { template: '<div><slot /><slot name="footer" /></div>' },
Icon: { template: '<span />' }
}
}
})
const clientTabs = () => wrapper.find('nav[aria-label="Client"]').text()
expect(clientTabs()).toContain('keys.useKeyModal.cliTabs.codexCli')
expect(clientTabs()).toContain('keys.useKeyModal.cliTabs.opencode')
const codexTab = wrapper.find('nav[aria-label="Client"]').findAll('button').find(
(button) => button.text().includes('keys.useKeyModal.cliTabs.codexCli')
)
await codexTab!.trigger('click')
await wrapper.setProps({ claudeCodeOnly: true })
expect(clientTabs()).toContain('keys.useKeyModal.cliTabs.claudeCode')
expect(clientTabs()).not.toContain('keys.useKeyModal.cliTabs.codexCli')
expect(clientTabs()).not.toContain('keys.useKeyModal.cliTabs.opencode')
expect(wrapper.find('pre code').text()).toContain('CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC')
await wrapper.setProps({ platform: 'openai' })
expect(clientTabs()).toContain('keys.useKeyModal.cliTabs.claudeCode')
expect(clientTabs()).not.toContain('keys.useKeyModal.cliTabs.codexCli')
expect(clientTabs()).not.toContain('keys.useKeyModal.cliTabs.opencode')
expect(wrapper.find('pre code').text()).toContain('ANTHROPIC_BASE_URL')
})
it('omits the attribution override from every standard Claude Code setup form', async () => {
const wrapper = mount(UseKeyModal, {
props: {
+1
View File
@@ -1075,6 +1075,7 @@
:api-key="selectedKey?.key || ''"
:base-url="publicSettings?.api_base_url || ''"
:platform="selectedKey?.group?.platform || null"
:claude-code-only="selectedKey?.group?.claude_code_only || false"
:allow-messages-dispatch="selectedKey?.group?.allow_messages_dispatch || false"
@close="closeUseKeyModal"
/>