// electron/modules/claude-code-installer.ts - Claude Code 安装模块 import { BrowserWindow } from 'electron' import type { SoftwareTypeWithAll } from './types' import { installClaudeCode as installClaudeCodeCore } from './installer' import logger from './logger' /** * 发送状态到渲染进程 */ function sendToRenderer(channel: string, data: unknown): void { const windows = BrowserWindow.getAllWindows() windows.forEach((win) => { win.webContents.send(channel, data) }) } /** * 安装 Claude Code * 供 IPC handler 和 installer.ts 复用 * @returns 安装结果 */ export async function installClaudeCode(): Promise<{ success: boolean; error?: string }> { try { // 状态回调,将状态发送到渲染进程 const onStatus = (software: SoftwareTypeWithAll, message: string, progress: number, skipLog?: boolean): void => { sendToRenderer('install-status', { software, message, progress, skipLog }) if (!skipLog) { logger.installInfo(`[${software}] ${message} (${progress}%)`) } } await installClaudeCodeCore(onStatus) sendToRenderer('install-complete', { software: 'claudeCode', message: '✅ Claude Code 安装完成!', i18nKey: 'log.claudeCodeInstallSuccess' }) return { success: true } } catch (error) { const execaError = error as { message?: string; stderr?: string; stdout?: string; shortMessage?: string } let errorMessage = execaError.shortMessage || execaError.message || '未知错误' // 过滤乱码字符 if (execaError.stderr) { const stderrClean = execaError.stderr.replace(/[^\x20-\x7E\u4e00-\u9fa5\n\r]/g, '').trim() if (stderrClean) { errorMessage = `${errorMessage}\n${stderrClean}` } } logger.installError('Claude Code 安装失败', error) sendToRenderer('install-error', { software: 'claudeCode', message: `❌ 安装失败:${errorMessage}`, i18nKey: 'log.claudeCodeInstallFailed' }) return { success: false, error: errorMessage } } }