mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-05-16 09:39:29 +08:00
e4b58c7206
Kaku is a WezTerm-derived macOS terminal, so reusing the existing WezTerm-compatible launch path keeps the change small while making it selectable in settings and session resume flows. Constraint: Kaku support should stay macOS-only and avoid introducing a separate launcher model Rejected: Treat Kaku as a silent WezTerm fallback | users could not explicitly choose it in settings Confidence: high Scope-risk: narrow Reversibility: clean Directive: Keep Kaku on the shared WezTerm-compatible launch path unless upstream drops the start-compatible CLI Tested: pnpm typecheck; pnpm format:check; cargo check --manifest-path src-tauri/Cargo.toml; cargo fmt --manifest-path src-tauri/Cargo.toml --check; cargo test --manifest-path src-tauri/Cargo.toml --lib session_manager::terminal::tests Not-tested: End-to-end launch against a locally installed Kaku.app Related: #1954
114 lines
3.3 KiB
TypeScript
114 lines
3.3 KiB
TypeScript
import { useTranslation } from "react-i18next";
|
|
import {
|
|
Select,
|
|
SelectContent,
|
|
SelectItem,
|
|
SelectTrigger,
|
|
SelectValue,
|
|
} from "@/components/ui/select";
|
|
import { isMac, isWindows, isLinux } from "@/lib/platform";
|
|
|
|
// Terminal options per platform
|
|
const MACOS_TERMINALS = [
|
|
{ value: "terminal", labelKey: "settings.terminal.options.macos.terminal" },
|
|
{ value: "iterm2", labelKey: "settings.terminal.options.macos.iterm2" },
|
|
{ value: "alacritty", labelKey: "settings.terminal.options.macos.alacritty" },
|
|
{ value: "kitty", labelKey: "settings.terminal.options.macos.kitty" },
|
|
{ value: "ghostty", labelKey: "settings.terminal.options.macos.ghostty" },
|
|
{ value: "wezterm", labelKey: "settings.terminal.options.macos.wezterm" },
|
|
{ value: "kaku", labelKey: "settings.terminal.options.macos.kaku" },
|
|
] as const;
|
|
|
|
const WINDOWS_TERMINALS = [
|
|
{ value: "cmd", labelKey: "settings.terminal.options.windows.cmd" },
|
|
{
|
|
value: "powershell",
|
|
labelKey: "settings.terminal.options.windows.powershell",
|
|
},
|
|
{ value: "wt", labelKey: "settings.terminal.options.windows.wt" },
|
|
] as const;
|
|
|
|
const LINUX_TERMINALS = [
|
|
{
|
|
value: "gnome-terminal",
|
|
labelKey: "settings.terminal.options.linux.gnomeTerminal",
|
|
},
|
|
{ value: "konsole", labelKey: "settings.terminal.options.linux.konsole" },
|
|
{
|
|
value: "xfce4-terminal",
|
|
labelKey: "settings.terminal.options.linux.xfce4Terminal",
|
|
},
|
|
{ value: "alacritty", labelKey: "settings.terminal.options.linux.alacritty" },
|
|
{ value: "kitty", labelKey: "settings.terminal.options.linux.kitty" },
|
|
{ value: "ghostty", labelKey: "settings.terminal.options.linux.ghostty" },
|
|
] as const;
|
|
|
|
// Get terminals for the current platform
|
|
function getTerminalOptions() {
|
|
if (isMac()) {
|
|
return MACOS_TERMINALS;
|
|
}
|
|
if (isWindows()) {
|
|
return WINDOWS_TERMINALS;
|
|
}
|
|
if (isLinux()) {
|
|
return LINUX_TERMINALS;
|
|
}
|
|
// Fallback to macOS options
|
|
return MACOS_TERMINALS;
|
|
}
|
|
|
|
// Get default terminal for the current platform
|
|
function getDefaultTerminal(): string {
|
|
if (isMac()) {
|
|
return "terminal";
|
|
}
|
|
if (isWindows()) {
|
|
return "cmd";
|
|
}
|
|
if (isLinux()) {
|
|
return "gnome-terminal";
|
|
}
|
|
return "terminal";
|
|
}
|
|
|
|
export interface TerminalSettingsProps {
|
|
value?: string;
|
|
onChange: (value: string) => void;
|
|
}
|
|
|
|
export function TerminalSettings({ value, onChange }: TerminalSettingsProps) {
|
|
const { t } = useTranslation();
|
|
const terminals = getTerminalOptions();
|
|
const defaultTerminal = getDefaultTerminal();
|
|
|
|
// Use value or default
|
|
const currentValue = value || defaultTerminal;
|
|
|
|
return (
|
|
<section className="space-y-2">
|
|
<header className="space-y-1">
|
|
<h3 className="text-sm font-medium">{t("settings.terminal.title")}</h3>
|
|
<p className="text-xs text-muted-foreground">
|
|
{t("settings.terminal.description")}
|
|
</p>
|
|
</header>
|
|
<Select value={currentValue} onValueChange={onChange}>
|
|
<SelectTrigger className="w-[200px]">
|
|
<SelectValue />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{terminals.map((terminal) => (
|
|
<SelectItem key={terminal.value} value={terminal.value}>
|
|
{t(terminal.labelKey)}
|
|
</SelectItem>
|
|
))}
|
|
</SelectContent>
|
|
</Select>
|
|
<p className="text-xs text-muted-foreground">
|
|
{t("settings.terminal.fallbackHint")}
|
|
</p>
|
|
</section>
|
|
);
|
|
}
|