| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // 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 }
- }
- }
|