feat(cli): add beautiful colored output and fix daemon exit bug
Some checks failed
CI / Type Check & Lint (push) Failing after 6s
CI / Build Test (Current Platform) (push) Successful in 6s
Release / build-and-release (push) Successful in 44s
CI / Build All Platforms (push) Successful in 50s
CI / Type Check & Lint (pull_request) Failing after 5s
CI / Build Test (Current Platform) (pull_request) Successful in 5s
CI / Build All Platforms (pull_request) Successful in 49s
Some checks failed
CI / Type Check & Lint (push) Failing after 6s
CI / Build Test (Current Platform) (push) Successful in 6s
Release / build-and-release (push) Successful in 44s
CI / Build All Platforms (push) Successful in 50s
CI / Type Check & Lint (pull_request) Failing after 5s
CI / Build Test (Current Platform) (pull_request) Successful in 5s
CI / Build All Platforms (pull_request) Successful in 49s
Major improvements: - Created color theme system (ts/colors.ts) with ANSI colors - Enhanced logger with colors, table formatting, and styled boxes - Fixed daemon exit bug - now stays running when no UPS configured - Added config hot-reload with file watcher for live updates - Beautified CLI help output with color-coded commands - Added showcase test demonstrating all output features - Fixed ANSI code handling for perfect table/box alignment Features: - Color-coded messages (success=green, error=red, warning=yellow, info=cyan) - Status symbols (●○◐◯ for running/stopped/starting/unknown) - Battery level colors (green>60%, yellow 30-60%, red<30%) - Table formatting with auto-sizing and column alignment - Styled boxes (success, error, warning, info styles) - Hot-reload: daemon watches config file and reloads automatically - Idle mode: daemon stays alive when no devices, checks periodically Daemon improvements: - No longer exits when no UPS devices configured - Enters idle monitoring loop waiting for config - File watcher detects config changes in real-time - Auto-reloads and starts monitoring when devices added - Logs warnings instead of errors for missing devices Technical fixes: - Strip ANSI codes when calculating text width for alignment - Use visible length for padding calculations in tables and boxes - Properly handle colored text in table cells and box lines Breaking changes: None (backward compatible)
This commit is contained in:
114
ts/cli.ts
114
ts/cli.ts
@@ -1,6 +1,7 @@
|
||||
import { execSync } from 'node:child_process';
|
||||
import { Nupst } from './nupst.ts';
|
||||
import { logger } from './logger.ts';
|
||||
import { theme, symbols } from './colors.ts';
|
||||
|
||||
/**
|
||||
* Class for handling CLI commands
|
||||
@@ -475,58 +476,83 @@ export class NupstCli {
|
||||
* Display help message
|
||||
*/
|
||||
private showHelp(): void {
|
||||
logger.log(`
|
||||
NUPST - UPS Shutdown Tool
|
||||
console.log('');
|
||||
logger.highlight('NUPST - UPS Shutdown Tool');
|
||||
logger.dim('Deno-powered UPS monitoring and shutdown automation');
|
||||
console.log('');
|
||||
|
||||
Usage:
|
||||
nupst <command> [options]
|
||||
// Usage section
|
||||
logger.log(theme.info('Usage:'));
|
||||
logger.log(` ${theme.command('nupst')} ${theme.dim('<command> [options]')}`);
|
||||
console.log('');
|
||||
|
||||
Commands:
|
||||
service <subcommand> - Manage systemd service
|
||||
ups <subcommand> - Manage UPS devices
|
||||
group <subcommand> - Manage UPS groups
|
||||
config [show] - Display current configuration
|
||||
update - Update NUPST from repository (requires root)
|
||||
uninstall - Completely remove NUPST from system (requires root)
|
||||
help, --help, -h - Show this help message
|
||||
--version, -v - Show version information
|
||||
// Main commands section
|
||||
logger.log(theme.info('Commands:'));
|
||||
this.printCommand('service <subcommand>', 'Manage systemd service');
|
||||
this.printCommand('ups <subcommand>', 'Manage UPS devices');
|
||||
this.printCommand('group <subcommand>', 'Manage UPS groups');
|
||||
this.printCommand('config [show]', 'Display current configuration');
|
||||
this.printCommand('update', 'Update NUPST from repository', theme.dim('(requires root)'));
|
||||
this.printCommand('uninstall', 'Completely remove NUPST', theme.dim('(requires root)'));
|
||||
this.printCommand('help, --help, -h', 'Show this help message');
|
||||
this.printCommand('--version, -v', 'Show version information');
|
||||
console.log('');
|
||||
|
||||
Service Subcommands:
|
||||
nupst service enable - Install and enable systemd service (requires root)
|
||||
nupst service disable - Stop and disable systemd service (requires root)
|
||||
nupst service start - Start the systemd service
|
||||
nupst service stop - Stop the systemd service
|
||||
nupst service restart - Restart the systemd service
|
||||
nupst service status - Show service and UPS status
|
||||
nupst service logs - Show service logs in real-time
|
||||
nupst service start-daemon - Start daemon process directly
|
||||
// Service subcommands
|
||||
logger.log(theme.info('Service Subcommands:'));
|
||||
this.printCommand('nupst service enable', 'Install and enable systemd service', theme.dim('(requires root)'));
|
||||
this.printCommand('nupst service disable', 'Stop and disable systemd service', theme.dim('(requires root)'));
|
||||
this.printCommand('nupst service start', 'Start the systemd service');
|
||||
this.printCommand('nupst service stop', 'Stop the systemd service');
|
||||
this.printCommand('nupst service restart', 'Restart the systemd service');
|
||||
this.printCommand('nupst service status', 'Show service and UPS status');
|
||||
this.printCommand('nupst service logs', 'Show service logs in real-time');
|
||||
this.printCommand('nupst service start-daemon', 'Start daemon process directly');
|
||||
console.log('');
|
||||
|
||||
UPS Subcommands:
|
||||
nupst ups add - Add a new UPS device
|
||||
nupst ups edit [id] - Edit a UPS device (default if no ID)
|
||||
nupst ups remove <id> - Remove a UPS device by ID
|
||||
nupst ups list (or ls) - List all configured UPS devices
|
||||
nupst ups test - Test UPS connections
|
||||
// UPS subcommands
|
||||
logger.log(theme.info('UPS Subcommands:'));
|
||||
this.printCommand('nupst ups add', 'Add a new UPS device');
|
||||
this.printCommand('nupst ups edit [id]', 'Edit a UPS device (default if no ID)');
|
||||
this.printCommand('nupst ups remove <id>', 'Remove a UPS device by ID');
|
||||
this.printCommand('nupst ups list (or ls)', 'List all configured UPS devices');
|
||||
this.printCommand('nupst ups test', 'Test UPS connections');
|
||||
console.log('');
|
||||
|
||||
Group Subcommands:
|
||||
nupst group add - Add a new UPS group
|
||||
nupst group edit <id> - Edit an existing UPS group
|
||||
nupst group remove <id> - Remove a UPS group by ID
|
||||
nupst group list (or ls) - List all UPS groups
|
||||
// Group subcommands
|
||||
logger.log(theme.info('Group Subcommands:'));
|
||||
this.printCommand('nupst group add', 'Add a new UPS group');
|
||||
this.printCommand('nupst group edit <id>', 'Edit an existing UPS group');
|
||||
this.printCommand('nupst group remove <id>', 'Remove a UPS group by ID');
|
||||
this.printCommand('nupst group list (or ls)', 'List all UPS groups');
|
||||
console.log('');
|
||||
|
||||
Options:
|
||||
--debug, -d - Enable debug mode for detailed SNMP logging
|
||||
(Example: nupst ups test --debug)
|
||||
// Options
|
||||
logger.log(theme.info('Options:'));
|
||||
this.printCommand('--debug, -d', 'Enable debug mode for detailed SNMP logging');
|
||||
logger.dim(' (Example: nupst ups test --debug)');
|
||||
console.log('');
|
||||
|
||||
Examples:
|
||||
nupst service enable - Install and start the service
|
||||
nupst ups add - Add a new UPS interactively
|
||||
nupst group list - Show all configured groups
|
||||
nupst config - Display current configuration
|
||||
// Examples
|
||||
logger.log(theme.info('Examples:'));
|
||||
logger.dim(' nupst service enable # Install and start the service');
|
||||
logger.dim(' nupst ups add # Add a new UPS interactively');
|
||||
logger.dim(' nupst group list # Show all configured groups');
|
||||
logger.dim(' nupst config # Display current configuration');
|
||||
console.log('');
|
||||
|
||||
Note: Old command format (e.g., 'nupst add') still works but is deprecated.
|
||||
Use the new format (e.g., 'nupst ups add') going forward.
|
||||
`);
|
||||
// Note about deprecated commands
|
||||
logger.warn('Note: Old command format (e.g., \'nupst add\') still works but is deprecated.');
|
||||
logger.dim(' Use the new format (e.g., \'nupst ups add\') going forward.');
|
||||
console.log('');
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to print a command with description
|
||||
*/
|
||||
private printCommand(command: string, description: string, extra?: string): void {
|
||||
const paddedCommand = command.padEnd(30);
|
||||
logger.log(` ${theme.command(paddedCommand)} ${description}${extra ? ' ' + extra : ''}`);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user