UNPKG

ccusage-live

Version:

Enhanced Claude Code usage analysis tool with live team monitoring and collaboration features

108 lines (107 loc) 3.9 kB
import { logger } from "./logger-D3prNztu.js"; import { Result } from "@praha/byethrow"; /** * 从package.json获取当前版本 */ async function getCurrentVersion() { try { const packageJsonPath = new URL("../package.json", import.meta.url); let packageJsonText; if (typeof Bun !== "undefined") packageJsonText = await Bun.file(packageJsonPath).text(); else { const fs = await import("node:fs/promises"); packageJsonText = await fs.readFile(packageJsonPath, "utf-8"); } const packageJson = JSON.parse(packageJsonText); return Result.succeed(packageJson.version); } catch (error) { return Result.fail(`无法读取当前版本: ${error}`); } } /** * 从npm registry获取最新版本信息 */ async function getLatestVersionFromNpm(packageName) { try { const response = await fetch(`https://registry.npmjs.org/${packageName}`, { headers: { "Accept": "application/json", "User-Agent": "ccusage-live-update-checker" } }); if (!response.ok) return Result.fail(`npm registry请求失败: ${response.status} ${response.statusText}`); const data = await response.json(); const latestVersion = data["dist-tags"]?.latest; if (!latestVersion) return Result.fail("无法从npm registry获取最新版本信息"); return Result.succeed(latestVersion); } catch (error) { return Result.fail(`获取npm版本信息失败: ${error}`); } } /** * 比较两个语义化版本 * @param currentVersion 当前版本 * @param latestVersion 最新版本 * @returns 如果最新版本更高则返回true */ function compareVersions(currentVersion, latestVersion) { const current = currentVersion.replace(/^v/, "").split(".").map(Number); const latest = latestVersion.replace(/^v/, "").split(".").map(Number); for (let i = 0; i < Math.max(current.length, latest.length); i++) { const currentPart = current[i] || 0; const latestPart = latest[i] || 0; if (latestPart > currentPart) return true; if (latestPart < currentPart) return false; } return false; } /** * 检查是否有可用更新 */ async function checkForUpdates(packageName = "ccusage-live", silent = false) { const currentVersionResult = await getCurrentVersion(); if (Result.isFailure(currentVersionResult)) return Result.fail(currentVersionResult.error); const currentVersion = currentVersionResult.value; if (!silent) logger.info("检查更新中..."); const latestVersionResult = await getLatestVersionFromNpm(packageName); if (Result.isFailure(latestVersionResult)) return Result.fail(latestVersionResult.error); const latestVersion = latestVersionResult.value; const hasUpdate = compareVersions(currentVersion, latestVersion); const result = { currentVersion, latestVersion, hasUpdate }; if (hasUpdate) result.updateAvailable = { newVersion: latestVersion }; return Result.succeed(result); } /** * 显示更新提示信息 */ function showUpdateNotification(versionCheck, packageName = "ccusage-live") { if (!versionCheck.hasUpdate) { logger.info(`✅ 已是最新版本 (${versionCheck.currentVersion})`); return; } const { currentVersion, latestVersion } = versionCheck; console.log(""); logger.warn(`🔄 发现新版本可用!`); logger.info(` 当前版本: ${currentVersion}`); logger.info(` 最新版本: ${latestVersion}`); console.log(""); logger.info("📦 更新命令:"); logger.info(` npm update -g ${packageName}`); logger.info(" # 或者"); logger.info(` bun install -g ${packageName}@latest`); console.log(""); } /** * 执行更新检查并显示结果 */ async function performUpdateCheck(packageName, silent = false) { const result = await checkForUpdates(packageName, silent); if (Result.isFailure(result)) { if (!silent) logger.error(`更新检查失败: ${result.error}`); return; } if (!silent) showUpdateNotification(result.value, packageName); } export { checkForUpdates, performUpdateCheck, showUpdateNotification };