import React from 'react'; import { envDynamic } from 'src/utils/envDynamic.js'; import { Box, Text } from '@anthropic/ink'; import { useKeybindings } from '../keybindings/useKeybinding.js'; import { getGlobalConfig, saveGlobalConfig } from '../utils/config.js'; import { env } from '../utils/env.js'; import { getTerminalIdeType, type IDEExtensionInstallationStatus, isJetBrainsIde, toIDEDisplayName, } from '../utils/ide.js'; import { Dialog } from '@anthropic/ink'; interface Props { onDone: () => void; installationStatus: IDEExtensionInstallationStatus | null; } export function IdeOnboardingDialog({ onDone, installationStatus }: Props): React.ReactNode { markDialogAsShown(); // Handle Enter/Escape to dismiss useKeybindings( { 'confirm:yes': onDone, 'confirm:no': onDone, }, { context: 'Confirmation' }, ); const ideType = installationStatus?.ideType ?? getTerminalIdeType(); const isJetBrains = isJetBrainsIde(ideType); const ideName = toIDEDisplayName(ideType); const installedVersion = installationStatus?.installedVersion; const pluginOrExtension = isJetBrains ? 'plugin' : 'extension'; const mentionShortcut = env.platform === 'darwin' ? 'Cmd+Option+K' : 'Ctrl+Alt+K'; return ( <> Welcome to Claude Code for {ideName} } subtitle={installedVersion ? `installed ${pluginOrExtension} v${installedVersion}` : undefined} color="ide" onCancel={onDone} hideInputGuide > • Claude has context of ⧉ open files and{' '} ⧉ selected lines • Review Claude Code's changes +11{' '} -22 in the comfort of your IDE • Cmd+Esc for Quick Launch • {mentionShortcut} to reference files or lines in your input Press Enter to continue ); } export function hasIdeOnboardingDialogBeenShown(): boolean { const config = getGlobalConfig(); const terminal = envDynamic.terminal || 'unknown'; return config.hasIdeOnboardingBeenShown?.[terminal] === true; } function markDialogAsShown(): void { if (hasIdeOnboardingDialogBeenShown()) { return; } const terminal = envDynamic.terminal || 'unknown'; saveGlobalConfig(current => ({ ...current, hasIdeOnboardingBeenShown: { ...current.hasIdeOnboardingBeenShown, [terminal]: true, }, })); }