UNPKG

@ace-sdk/cli

Version:

ACE CLI - Command-line tool for intelligent pattern learning and playbook management

141 lines 5.14 kB
/** * Version Checking System for @ace-sdk/cli * Checks CLI version against npm registry */ import { compareVersions, getClientVersion } from './semver.js'; import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs'; import { join } from 'path'; /** * Check latest CLI version from npm registry * Package: @ace-sdk/cli * * Returns latest published version (e.g., "1.0.0") */ async function checkLatestNpmVersion() { try { const response = await fetch('https://registry.npmjs.org/@ace-sdk/cli/latest', { headers: { 'Accept': 'application/json', 'User-Agent': 'ce-ace-cli' } }); if (!response.ok) { // Package might not be published yet (404 is expected for unpublished packages) if (response.status === 404) { return null; // Not published yet } console.error(`⚠️ npm registry error: ${response.status}`); return null; } const data = await response.json(); return data.version || null; } catch (error) { // Silently fail - network errors are common return null; } } /** * Perform complete version check * Returns version status with update availability */ export async function performVersionCheck() { const clientVersion = getClientVersion(); const warnings = []; console.error(`ℹ️ Checking version (current: ${clientVersion})...`); // Check npm package version for CLI updates const latestNpmVersion = await checkLatestNpmVersion(); let isCliUpdateAvailable = false; if (latestNpmVersion) { console.error(`ℹ️ Latest npm version: ${latestNpmVersion}`); if (compareVersions(latestNpmVersion, clientVersion) > 0) { isCliUpdateAvailable = true; warnings.push(`🎉 New version available: v${latestNpmVersion} (current: v${clientVersion}). ` + `Update with: npm install -g @ace-sdk/cli@latest`); } } // Silently ignore if npm check fails (package not published yet or network error) return { clientVersion, latestNpmVersion, isCliUpdateAvailable, warnings }; } /** * Check version and log warnings (non-blocking) * Called during CLI initialization */ export async function checkVersionCompatibility() { const status = await performVersionCheck(); // Log warnings (non-blocking) if (status.warnings.length > 0) { console.error(''); console.error('⚠️ Version Warnings:'); status.warnings.forEach((warning, index) => { console.error(` ${index + 1}. ${warning}`); }); console.error(''); } return status; } /** * Lightweight CLI update checker with caching * Only checks npm registry * Caches result for 24 hours to avoid spamming npm registry */ export async function checkCliUpdate() { try { const cacheDir = join(process.env.HOME || process.env.USERPROFILE || '/tmp', '.ace-cache'); const cacheFile = join(cacheDir, 'cli-version-check.json'); const now = Date.now(); const cacheTtl = 24 * 60 * 60 * 1000; // 24 hours // Check cache if (existsSync(cacheFile)) { const cached = JSON.parse(readFileSync(cacheFile, 'utf8')); if (now - cached.timestamp < cacheTtl) { // Cache is fresh if (cached.updateAvailable) { console.error(`\n💡 Update available: v${cached.latestVersion} → Run: npm install -g @ace-sdk/cli@latest\n`); } return; } } // Cache miss or expired - check npm const currentVersion = getClientVersion(); const latestVersion = await checkLatestNpmVersion(); if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) { // Update available const cacheData = { timestamp: now, updateAvailable: true, currentVersion, latestVersion }; // Save to cache if (!existsSync(cacheDir)) { mkdirSync(cacheDir, { recursive: true }); } writeFileSync(cacheFile, JSON.stringify(cacheData)); console.error(`\n💡 Update available: v${latestVersion} (current: v${currentVersion})`); console.error(` Run: npm install -g @ace-sdk/cli@latest\n`); } else { // No update or check failed const cacheData = { timestamp: now, updateAvailable: false, currentVersion, latestVersion: latestVersion || currentVersion }; if (!existsSync(cacheDir)) { mkdirSync(cacheDir, { recursive: true }); } writeFileSync(cacheFile, JSON.stringify(cacheData)); } } catch (error) { // Silently fail - update checks shouldn't break the CLI } } //# sourceMappingURL=version-checker.js.map