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)
Previously only checked 'is-active' which missed failed/stopped services.
Now checks 'is-enabled' OR 'is-active' to ensure service file gets updated
during v3→v4 migration regardless of service state.
Critical fixes for v3→v4 migration:
1. install.sh: Auto-update systemd service file during migration
- Calls 'nupst service enable' before restarting service
- Only when migrating from v3 (OLD_NODE_INSTALL=1)
- Ensures service file has correct v4 paths
2. ts/systemd.ts: Fix hardcoded v3 paths in service template
- ExecStart: /opt/nupst/bin/nupst daemon-start (v3, broken)
→ /usr/local/bin/nupst service start-daemon (v4, correct)
- Description: Updated to 'Deno-powered UPS Monitoring Tool'
- Added RestartSec=10 (prevent rapid restart loops)
- Removed NODE_ENV=production (not needed for Deno)
- WorkingDirectory: /tmp → /opt/nupst
Without these fixes:
- Service fails to start after migration
- Service file points to non-existent /opt/nupst/bin/nupst
- Users must manually run 'nupst service enable'
Discovered via Docker migration testing in test/manualdocker/
- Checks if release already exists for the tag
- Automatically deletes conflicting release if found
- Prevents duplicate/stale releases when recreating tags
- Ensures fresh binaries when tag is recreated
This fixes the issue where recreating a tag would keep old
release with outdated binaries.
- Replace hardcoded version in 00_commitinfo_data.ts
- Now dynamically imports deno.json and reads version
- Version will auto-update when deno.json is changed
- Fixes version showing 3.1.2 instead of 4.0.0
test: add Docker test scripts for v3→v4 migration
- 01-setup-v3-container.sh: Creates systemd container with v3
- 02-test-v3-to-v4-migration.sh: Tests migration (now fixed)
- 03-cleanup.sh: Removes test container
- README.md: Complete documentation
Tested: Version now correctly shows 4.0.0
- Changed back to single artifact containing all binaries
- Named 'nupst-binaries.zip' to clarify it's a ZIP container
- Contains all 5 platform binaries + SHA256SUMS.txt
- Split single 'nupst-binaries' artifact into 6 individual artifacts
- Each platform binary now shows as separate downloadable item in UI
- Artifacts: nupst-linux-x64, nupst-linux-arm64, nupst-macos-x64,
nupst-macos-arm64, nupst-windows-x64.exe, SHA256SUMS.txt
- actions/upload-artifact@v4 not supported on Gitea
- Error: GHES (GitHub Enterprise Server) compatibility issue
- Using v3 which is compatible with Gitea Actions
- Remove conditional from build-all job in ci.yml
- Previously only ran on main branch and tags
- Now runs on every commit to any branch
- Allows testing binaries from feature branches via artifacts API
- Remove async from functions that don't use await
- Change return types from Promise<void> to void for synchronous functions
- Fixes all 8 require-await lint warnings
- Reduces total lint warnings from 63 to 55
- Clean old binaries from dist/binaries before each build
- Automatically delete old releases, keeping only the last 3
- Prevents accumulation of stale binaries and release storage bloat
Enhanced install.sh to properly handle updates and migrations:
**Update Detection & Service Management:**
- Detect old Node.js-based installations (v3.x) via package.json/node_modules
- Stop running service before updating binary
- Restart service after successful update if it was running
- Preserve /etc/nupst/config.json during updates
**Migration from v3.x to v4.0:**
- Clean up old Node.js installation files:
- node_modules/, vendor/, dist_ts/ directories
- package.json, package-lock.json, pnpm-lock.yaml
- tsconfig.json, setup.sh, bin/ directory
- Inform user about migration with helpful feedback
- Link to migration guide documentation
**User Experience Improvements:**
- Show different messages for new installs vs updates
- Inform about v3.x → v4.0 migration when detected
- Display migration guide link for old installations
- Show service restart status
- Provide context-aware next steps based on config presence
**Safety Features:**
- Ask for confirmation before replacing existing installation (interactive mode)
- Preserve user configuration in /etc/nupst/
- Handle service state properly (stop → update → restart)
- Graceful cleanup with error suppression (|| true)
This ensures seamless updates from any version (including v3.x Node.js installs)
to v4.0+ Deno-based binaries without manual intervention or data loss.
Comprehensive type safety improvements across all CLI handlers and daemon:
**Error handling type fixes:**
- Add 'error instanceof Error' checks before accessing error.message throughout
- Fix all error/retryError/stdError/upsError type assertions
- Replace direct error.message with proper type guards
**Switch case improvements:**
- Wrap case block declarations in braces to satisfy deno-lint
- Fix no-case-declarations warnings in CLI command handlers
**Null/undefined safety:**
- Add checks for config.snmp and config.thresholds before access
- Fix IUpsStatus lastStatusChange to handle undefined with default value
- Add proper null checks in legacy configuration paths
**Type annotations:**
- Add explicit type annotations to lambda parameters (groupId, updateAvailable, etc.)
- Add TUpsModel type cast for 'cyberpower' default
- Import and use INupstConfig type where needed
**Parameter type fixes:**
- Fix implicit 'any' type errors in array callbacks
- Add type annotations to filter/find/map parameters
Files modified:
- ts/cli.ts: config.snmp/thresholds null checks, unused error variable fixes
- ts/cli/group-handler.ts: 4 error.message fixes + 2 parameter type annotations
- ts/cli/service-handler.ts: 3 error.message fixes
- ts/cli/ups-handler.ts: 5 error.message fixes + config checks + TUpsModel import
- ts/daemon.ts: 8 error.message fixes + IUpsStatus lastStatusChange fix + updateAvailable type
- ts/nupst.ts: 1 error.message fix
- ts/systemd.ts: 5 error.message fixes + parameter type annotation
All tests passing (3/3 SNMP tests + 10/10 logger tests)
Type check: ✓ No errors
- Add Buffer import from node:buffer to manager.ts and types.ts
- Fix error handling type assertions (error/retryError/stdError as unknown)
- Add explicit type annotation to byte parameter in isPrintableAscii check
- All tests now passing (3 SNMP tests + 10 logger tests)
- Remove tapbundle and @git.zone/tstest dependency
- Use Deno.test() and @std/assert for all tests
- Update test imports to use jsr:@std/assert
- All 10 logger tests passing with native Deno test runner
- Simplified test configuration in deno.json
- Tests are now completely dependency-free (only standard library)
- Update tapbundle imports from @push.rocks to @git.zone/tstest
- Change all test file imports from .js to .ts extensions
- Tests verified working with Deno runtime
- All 10 logger tests passing
- SNMP tests ready for Deno execution
- Rewrite README.md for Deno-based binary distribution
- Update installation instructions for binary downloads
- Document new subcommand CLI structure
- Add troubleshooting, security, and development sections
- Remove Node.js references, add Deno information
- Add comprehensive v4.0.0 changelog entry
- Document all breaking changes
- List new features and technical improvements
- Provide migration guide and command mapping
- Include technical details and benefits
- Create MIGRATION.md guide for v3.x to v4.0 upgrade
- Step-by-step migration instructions
- Configuration compatibility information
- Troubleshooting common migration issues
- Rollback procedures
- Post-migration best practices
Major Changes:
- Reorganized commands into logical groups (service, ups, group)
- Added new subcommand structure:
- nupst service <enable|disable|start|stop|restart|status|logs|start-daemon>
- nupst ups <add|edit|remove|list|test>
- nupst group <add|edit|remove|list>
- nupst config [show]
- Added --version/-v flag support
- Added restart subcommand for service
- Added command aliases (ls, rm)
- Renamed delete() to remove() in handlers
- Maintained backward compatibility with deprecation warnings
- Updated all help messages to reflect new structure
- Added showVersion(), showServiceHelp(), showUpsHelp() methods
- Fixed readline imports to use node:readline
Breaking Changes:
- Old command format (e.g. 'nupst add') is deprecated
- Users should migrate to new format (e.g. 'nupst ups add')
- Backward compatibility maintained with warnings for now
- Created scripts/compile-all.sh for all 5 platforms
- Successfully compiled binaries for:
- Linux x64 (345MB)
- Linux ARM64 (340MB)
- macOS x64 (337MB)
- macOS ARM64 (334MB)
- Windows x64 (345MB)
- Added --no-check flag to bypass npm:net-snmp type issues
- Updated .gitignore for Deno artifacts
- Tested compiled binary - working successfully
Note: Binaries embed npm:net-snmp with native bindings
Warning from Deno about cross-platform node_modules compatibility noted
- Created deno.json configuration
- Updated all imports to use npm:net-snmp@3.20.0
- Changed all Node.js built-in imports to node: specifiers
- Updated all .js extensions to .ts in imports
- Created mod.ts as Deno entry point
- Ready for Phase 3: CLI simplification