UNPKG

automagik-genie

Version:

Self-evolving AI agent orchestration framework with Model Context Protocol support

97 lines (96 loc) 3.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkForUpdates = checkForUpdates; const child_process_1 = require("child_process"); /** * Check if updates are available by comparing installed version with npm registry */ async function checkForUpdates(installedVersion, installedCommit, channel = 'latest') { try { // Get latest version from npm registry (respecting channel) const latestVersion = (0, child_process_1.execSync)(`npm view automagik-genie@${channel} version`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim(); // Get git commit from npm package (if available) let latestCommit; try { latestCommit = (0, child_process_1.execSync)(`npm view automagik-genie@${channel} gitCommit`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim(); } catch { // gitCommit field not yet in package.json, use version comparison only latestCommit = 'unknown'; } // Compare versions const available = compareVersions(installedVersion, latestVersion) < 0; // Get changelog (placeholder for now) const changes = available ? [ `+ New features and improvements`, `~ Bug fixes and enhancements`, `📚 Run 'git log ${installedCommit}..${latestCommit}' for details` ] : []; return { available, latestVersion, latestCommit, changes }; } catch (error) { throw new Error(`Failed to check for updates: ${error instanceof Error ? error.message : String(error)}`); } } /** * Compare semantic versions (v2.5.0-rc.15 vs v2.5.0-rc.16) * Returns: -1 if a < b, 0 if a === b, 1 if a > b */ function compareVersions(a, b) { const parseVersion = (v) => { // Remove leading 'v' if present const clean = v.startsWith('v') ? v.slice(1) : v; // Split into parts: "2.5.0-rc.15" → ["2", "5", "0", "rc", "15"] const match = clean.match(/^(\d+)\.(\d+)\.(\d+)(?:-([a-z]+)\.(\d+))?$/); if (!match) { throw new Error(`Invalid version format: ${v}`); } const [, major, minor, patch, prerelease, prereleaseNum] = match; return { major: parseInt(major, 10), minor: parseInt(minor, 10), patch: parseInt(patch, 10), prerelease: prerelease || null, prereleaseNum: prereleaseNum ? parseInt(prereleaseNum, 10) : null }; }; const versionA = parseVersion(a); const versionB = parseVersion(b); // Compare major.minor.patch if (versionA.major !== versionB.major) return versionA.major < versionB.major ? -1 : 1; if (versionA.minor !== versionB.minor) return versionA.minor < versionB.minor ? -1 : 1; if (versionA.patch !== versionB.patch) return versionA.patch < versionB.patch ? -1 : 1; // Both stable versions (no prerelease) if (!versionA.prerelease && !versionB.prerelease) return 0; // Stable > prerelease if (!versionA.prerelease) return 1; // a is stable, b is prerelease if (!versionB.prerelease) return -1; // a is prerelease, b is stable // Both prereleases, compare prerelease numbers if (versionA.prereleaseNum === null || versionB.prereleaseNum === null) { throw new Error(`Invalid prerelease version format`); } if (versionA.prereleaseNum < versionB.prereleaseNum) return -1; if (versionA.prereleaseNum > versionB.prereleaseNum) return 1; return 0; }