Parcourir la source

修复Claude Code的安装检测

黄中银 il y a 3 semaines
Parent
commit
1dd2cea827

+ 10 - 7
ApqInstaller/electron/modules/ipc-handlers.ts

@@ -255,13 +255,16 @@ export function registerHandlers(): void {
   // 检测 Claude Code 是否已安装
   registerHandler('check-claude-code', async () => {
     try {
-      // 尝试执行 claude --version 来检测是否安装
-      const result = await execa('claude', ['--version'])
-      const version = result.stdout.trim()
-      logger.info(`检测到 Claude Code: ${version}`)
-      return { installed: true, version }
-    } catch {
-      logger.info('未检测到 Claude Code')
+      // 使用 checkInstalled 函数,它会刷新 PATH 环境变量来检测新安装的软件
+      const result = await checkInstalled('claudeCode')
+      if (result.installed) {
+        logger.info(`检测到 Claude Code: ${result.version}`)
+      } else {
+        logger.info('未检测到 Claude Code')
+      }
+      return result
+    } catch (error) {
+      logger.warn('检测 Claude Code 失败', error)
       return { installed: false, version: null }
     }
   })

+ 26 - 3
ApqInstaller/electron/modules/utils.ts

@@ -110,6 +110,7 @@ export function httpsGet<T = unknown>(
  * 获取 Windows 系统最新的 PATH 环境变量
  * 安装软件后,系统 PATH 会更新,但当前进程的 PATH 不会自动更新
  * 通过 PowerShell 从注册表读取最新的 PATH
+ * 同时添加 pnpm 和 npm 的全局 bin 目录,确保能找到全局安装的命令
  */
 async function getRefreshedWindowsPath(): Promise<string> {
   try {
@@ -118,10 +119,32 @@ async function getRefreshedWindowsPath(): Promise<string> {
       '-Command',
       `[Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [Environment]::GetEnvironmentVariable('Path', 'User')`
     ])
-    return result.stdout.trim()
+    let newPath = result.stdout.trim()
+
+    // 添加 pnpm 全局 bin 目录(如果不在 PATH 中)
+    // pnpm 在 Windows 上的默认全局 bin 目录是 %LOCALAPPDATA%\pnpm
+    const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local')
+    const pnpmGlobalBin = path.join(localAppData, 'pnpm')
+    if (!newPath.toLowerCase().includes(pnpmGlobalBin.toLowerCase())) {
+      newPath = `${pnpmGlobalBin};${newPath}`
+    }
+
+    // 添加 npm 全局 bin 目录(如果不在 PATH 中)
+    // npm 在 Windows 上的默认全局 bin 目录是 %APPDATA%\npm
+    const appData = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')
+    const npmGlobalBin = path.join(appData, 'npm')
+    if (!newPath.toLowerCase().includes(npmGlobalBin.toLowerCase())) {
+      newPath = `${npmGlobalBin};${newPath}`
+    }
+
+    return newPath
   } catch {
-    // 如果失败,返回当前进程的 PATH
-    return process.env.PATH || ''
+    // 如果失败,返回当前进程的 PATH,并添加常用的全局 bin 目录
+    let fallbackPath = process.env.PATH || ''
+    const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local')
+    const appData = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')
+    fallbackPath = `${path.join(localAppData, 'pnpm')};${path.join(appData, 'npm')};${fallbackPath}`
+    return fallbackPath
   }
 }