@ace-sdk/cli
Version:
ACE CLI - Command-line tool for intelligent pattern learning and playbook management
141 lines • 5.14 kB
JavaScript
/**
* 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