diff --git a/src/assets/images/kitty.png b/src/assets/images/kitty.png new file mode 100644 index 000000000..2796a969a Binary files /dev/null and b/src/assets/images/kitty.png differ diff --git a/src/main/ipc/appIpc.ts b/src/main/ipc/appIpc.ts index 70ead3c32..a29685088 100644 --- a/src/main/ipc/appIpc.ts +++ b/src/main/ipc/appIpc.ts @@ -438,6 +438,16 @@ export function registerAppIpc() { if (lastError instanceof Error) throw lastError; throw new Error('Unable to launch Ghostty'); + } else if (appId === 'kitty') { + const kittyExecArgs = buildGhosttyRemoteExecArgs({ + host: connection.host, + username: connection.username, + port: connection.port, + targetPath: target, + }); + + await execFileCommand('kitty', ['-e', ...kittyExecArgs]); + return { success: true }; } else if (appConfig.supportsRemote) { // App claims to support remote but we don't have a handler return { diff --git a/src/shared/openInApps.ts b/src/shared/openInApps.ts index 9edc20188..6d8e40062 100644 --- a/src/shared/openInApps.ts +++ b/src/shared/openInApps.ts @@ -42,6 +42,7 @@ const ICON_PATHS = { phpstorm: 'phpstorm.svg', 'android-studio': 'android-studio.svg', kiro: 'kiro.png', + kitty: 'kitty.png', windsurf: 'windsurf.svg', } as const; @@ -264,6 +265,23 @@ export const OPEN_IN_APPS: OpenInAppConfigShape[] = [ }, }, }, + { + id: 'kitty', + label: 'Kitty', + iconPath: ICON_PATHS.kitty, + supportsRemote: true, + platforms: { + darwin: { + openCommands: ['open -b net.kovidgoyal.kitty {{path}}', 'open -a "kitty" {{path}}'], + bundleIds: ['net.kovidgoyal.kitty'], + appNames: ['kitty'], + }, + linux: { + openCommands: ['kitty --directory={{path}}'], + checkCommands: ['kitty'], + }, + }, + }, { id: 'zed', label: 'Zed', diff --git a/src/test/shared/openInApps.test.ts b/src/test/shared/openInApps.test.ts index 851a87161..d39acd82d 100644 --- a/src/test/shared/openInApps.test.ts +++ b/src/test/shared/openInApps.test.ts @@ -22,7 +22,7 @@ describe('isOpenInAppSupportedForWorkspace', () => { expect(remoteAppIds).not.toContain('zed'); expect(remoteAppIds).toEqual( - expect.arrayContaining(['cursor', 'vscode', 'terminal', 'warp', 'iterm2', 'ghostty']) + expect.arrayContaining(['cursor', 'vscode', 'terminal', 'warp', 'iterm2', 'ghostty', 'kitty']) ); expect(remoteAppIds).not.toContain('vscodium'); });