ccusage-live
Version:
Enhanced Claude Code usage analysis tool with live team monitoring and collaboration features
108 lines (107 loc) • 3.9 kB
JavaScript
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 };