claude-code-installer.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // electron/modules/claude-code-installer.ts - Claude Code 安装模块
  2. import { BrowserWindow } from 'electron'
  3. import type { SoftwareTypeWithAll } from './types'
  4. import { installClaudeCode as installClaudeCodeCore } from './installer'
  5. import logger from './logger'
  6. /**
  7. * 发送状态到渲染进程
  8. */
  9. function sendToRenderer(channel: string, data: unknown): void {
  10. const windows = BrowserWindow.getAllWindows()
  11. windows.forEach((win) => {
  12. win.webContents.send(channel, data)
  13. })
  14. }
  15. /**
  16. * 安装 Claude Code
  17. * 供 IPC handler 和 installer.ts 复用
  18. * @returns 安装结果
  19. */
  20. export async function installClaudeCode(): Promise<{ success: boolean; error?: string }> {
  21. try {
  22. // 状态回调,将状态发送到渲染进程
  23. const onStatus = (software: SoftwareTypeWithAll, message: string, progress: number, skipLog?: boolean): void => {
  24. sendToRenderer('install-status', { software, message, progress, skipLog })
  25. if (!skipLog) {
  26. logger.installInfo(`[${software}] ${message} (${progress}%)`)
  27. }
  28. }
  29. await installClaudeCodeCore(onStatus)
  30. sendToRenderer('install-complete', {
  31. software: 'claudeCode',
  32. message: '✅ Claude Code 安装完成!',
  33. i18nKey: 'log.claudeCodeInstallSuccess'
  34. })
  35. return { success: true }
  36. } catch (error) {
  37. const execaError = error as { message?: string; stderr?: string; stdout?: string; shortMessage?: string }
  38. let errorMessage = execaError.shortMessage || execaError.message || '未知错误'
  39. // 过滤乱码字符
  40. if (execaError.stderr) {
  41. const stderrClean = execaError.stderr.replace(/[^\x20-\x7E\u4e00-\u9fa5\n\r]/g, '').trim()
  42. if (stderrClean) {
  43. errorMessage = `${errorMessage}\n${stderrClean}`
  44. }
  45. }
  46. logger.installError('Claude Code 安装失败', error)
  47. sendToRenderer('install-error', {
  48. software: 'claudeCode',
  49. message: `❌ 安装失败:${errorMessage}`,
  50. i18nKey: 'log.claudeCodeInstallFailed'
  51. })
  52. return { success: false, error: errorMessage }
  53. }
  54. }