feat(update): enhance package manager detection, version reporting, and add verbose option

This commit is contained in:
2026-02-05 23:13:43 +00:00
parent d53e8fec6d
commit f495f85bdb
5 changed files with 152 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
import * as plugins from './mod.plugins.js';
import { PackageManagerUtil, type TPackageManager, type IPackageUpdateInfo } from './classes.packagemanager.js';
import { PackageManagerUtil, type TPackageManager, type IPackageUpdateInfo, type IPackageManagerInfo } from './classes.packagemanager.js';
const GITZONE_PACKAGES = [
'@git.zone/cli',
@@ -15,33 +15,69 @@ const GITZONE_PACKAGES = [
export interface IUpdateOptions {
yes?: boolean;
verbose?: boolean;
}
export const run = async (options: IUpdateOptions = {}): Promise<void> => {
const pmUtil = new PackageManagerUtil();
const verbose = options.verbose === true;
console.log('Scanning for installed @git.zone packages...\n');
// Check which package managers are available
const availablePMs: TPackageManager[] = [];
if (verbose) {
console.log('Detecting package managers:');
}
const detectedPMs: IPackageManagerInfo[] = [];
for (const pm of ['npm', 'yarn', 'pnpm'] as TPackageManager[]) {
if (await pmUtil.isAvailable(pm)) {
availablePMs.push(pm);
const info = await pmUtil.detectPackageManager(pm, verbose);
if (info.available) {
detectedPMs.push(info);
}
}
if (availablePMs.length === 0) {
if (verbose) {
console.log('');
}
if (detectedPMs.length === 0) {
console.log('No package managers found (npm, yarn, pnpm).');
console.log('Tried detection via \'which\' command and direct version check.');
return;
}
console.log(`Found package managers: ${availablePMs.join(', ')}\n`);
// Get version info for each PM and display status table
console.log('Package managers:\n');
console.log(' Name Current Latest Status');
console.log(' ──────────────────────────────────────────────');
for (const pmInfo of detectedPMs) {
const versionInfo = await pmUtil.getPackageManagerVersion(pmInfo.name);
pmInfo.currentVersion = versionInfo.current;
pmInfo.latestVersion = versionInfo.latest;
pmInfo.needsUpdate = versionInfo.latest
? pmUtil.isNewerVersion(versionInfo.current, versionInfo.latest)
: false;
const name = pmInfo.name.padEnd(9);
const current = versionInfo.current.padEnd(12);
const latest = (versionInfo.latest || 'unknown').padEnd(12);
const status = versionInfo.latest === null
? '? Version unknown'
: pmInfo.needsUpdate
? '⬆️ Update available'
: '✓ Up to date';
console.log(` ${name}${current}${latest}${status}`);
}
console.log('');
// Collect all installed @git.zone packages from all package managers
const allPackages: IPackageUpdateInfo[] = [];
for (const pm of availablePMs) {
const installed = await pmUtil.getInstalledPackages(pm);
for (const pmInfo of detectedPMs) {
const installed = await pmUtil.getInstalledPackages(pmInfo.name);
for (const pkg of installed) {
// Only include packages from our predefined list
if (GITZONE_PACKAGES.includes(pkg.name)) {
@@ -50,7 +86,7 @@ export const run = async (options: IUpdateOptions = {}): Promise<void> => {
name: pkg.name,
currentVersion: pkg.version,
latestVersion: latestVersion || 'unknown',
packageManager: pm,
packageManager: pmInfo.name,
needsUpdate: latestVersion ? pmUtil.isNewerVersion(pkg.version, latestVersion) : false,
});
}