All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.2.0 - 2025-10-17
- High-level KVM interface: New
KVMclass inkvm.pyproviding type-safe, structured interface for library usage - Multi-device addressing: Support for controlling multiple KVM switches on the same serial bus (addresses 0-99)
- Device discovery: New
discovercommand to find all devices on the serial bus with their firmware versions - Comprehensive CLI commands (replacing simple console.py):
status: Show system status with firmware version and addresshelp: Display device help informationinput switch: Switch inputs with output selectionoutput routing: Query current input-to-output routingoutput stream: Check output stream statusedid get/set: Manage EDID data for inputsdiscover: Find all devices on the serial bus- Multiple output formats:
--format raw|json|pretty
- Comprehensive test suite: Full test coverage with pytest
- Unit tests for
Device,KVM, and CLI commands - Integration tests for end-to-end workflows
- Hardware replay tests using pytest-reserial (no hardware needed for CI)
- Test coverage reporting with pytest-cov
- Unit tests for
- Test scripts for different testing scenarios:
test-record.sh: Record serial traffic from real hardwaretest-replay.sh: Run tests using recorded traffic (CI-friendly)test-with-hardware.sh: Run tests with actual hardware
- Enhanced documentation:
- Extensive README with installation, usage examples, and library usage guide
- Development setup instructions with uv
- Testing documentation
- Product documentation: Added official EZCOO KVM switch manual (PDF) in
docs/ - CI/CD workflows: GitHub Actions for automated testing and building on pull requests
- Composite actions for check and build steps
- Reusable workflow for check-and-build
- CI workflow triggered on PRs to main
- Release documentation: Complete manual release process guide in
RELEASING.mdincluding:- Version bumping and changelog updates
- GitHub release creation
- PyPI publishing
- AUR package updates
- BREAKING: License changed from Apache-2.0 to GPL-3.0-or-later
- BREAKING: Migrated from Poetry to uv for dependency management
- Removed
poetry.lockandpoetry.toml - Added
uv.lockand updatedpyproject.tomlto use PEP 621 format - Changed build backend from poetry-core to hatchling
- Removed
- BREAKING: Migrated from flake8 to ruff for linting and formatting
- Removed flake8, flake8-black, flake8-import-order
- Added ruff with comprehensive rule configuration
- Removed
.flake8configuration file
- BREAKING: Complete CLI rewrite (
cli.pyreplacesconsole.py)- New command structure with subcommands and groups
- Added
--addressoption for multi-device support - Added
--formatoption for output formatting (raw/json/pretty) - Default output format changed from raw device response to human-readable pretty format
- Removed direct device command exposure
- All commands now use high-level KVM interface
- BREAKING: Enhanced
Deviceclass with improved error handling- Added
DeviceErrorandDeviceConnectionErrorexceptions - Added command validation to prevent injection attacks
- Better error messages for connection and communication failures
- Configurable baudrate and timeout parameters
- Type hints updated to use modern Python 3.10+ syntax (
Self,type[])
- Added
- BREAKING: Response parsing now returns structured
KVMResponse[T]objects- Generic type parameter ensures type safety
- Includes raw command, raw response lines, and parsed response
- Enables both programmatic access and raw output
- Type safety improvements:
- Added
StreamStateenum for on/off states - Generic
KVMResponse[T]wrapper for all responses - Proper type hints throughout codebase
- Dataclasses for all structured data
- Added
- Dependencies:
- Removed:
attrs,mypy,flake8family - Added:
pytest,pytest-cov,pytest-reserial,ruff - Updated:
clickto 8.1.3+,pyserialto 3.5+ - Minimum Python version: 3.10
- Removed:
- console.py: Replaced by comprehensive
cli.pywith structured commands - Poetry configuration: Migrated to uv
- flake8 configuration: Migrated to ruff
- attrs dependency: Replaced with standard library dataclasses
- Improved error handling in device communication with specific exception types
- Better validation of command responses with structured parsing
- More reliable serial port handling with proper connection error handling
- Command injection prevention through input validation
- Added
.vscode/settings.jsonwith Python and testing configurations - Updated
.gitignorewith uv-specific patterns and test artifacts - Enhanced
pyproject.tomlwith:- Ruff configuration (line length, linting rules)
- Pytest configuration (test paths, coverage options)
- Coverage configuration (source paths, exclusions)
- Dependency groups for dev dependencies
0.1.1 - 2024-XX-XX
- Bump dependencies
0.1.0 - 2024-XX-XX
- Fix wrong baudrate
- Move things around and refactoring
0.0.1 - 2024-XX-XX
- Initial PoC implementation