Releases: Cyber-Syntax/my-unicorn
Releases · Cyber-Syntax/my-unicorn
Release v2.4.3-alpha
Fixed
- Fixed upgrade unexpected keyword argument error.
Release v2.4.2-alpha
Changed
- Upgraded dependencies:
Updated aiohttp v3.13.4 -> v3.13.5
Updated certifi v2026.2.25 -> v2026.4.22
Updated charset-normalizer v3.4.6 -> v3.4.7
Updated cryptography v46.0.6 -> v47.0.0
Updated idna v3.11 -> v3.13
Updated librt v0.8.1 -> v0.9.0
Updated more-itertools v10.8.0 -> v11.0.2
Updated mypy v1.19.1 -> v1.20.2
Updated orjson v3.11.7 -> v3.11.8
Updated packaging v26.0 -> v26.2
Updated pathspec v1.0.4 -> v1.1.1
Updated pytest v9.0.2 -> v9.0.3
Updated ruff v0.15.8 -> v0.15.12
Updated types-pyyaml v6.0.12.20250915 -> v6.0.12.20260408- For developers:
- Consolidated backup modules to one backup.py module for better organization and maintainability.
Fixed
- Fixed a orphaned metadata issue in the backup service where metadata entries were not being removed when the backup file was already gone, leading to orphaned metadata entries.
Release v2.4.1-alpha
Fixed
- Fixed SchemaValidationError; Missing required field 'catalog_ref' #241 by changing the load_app_config function to load_raw_app_config function.
Release v2.4.0-alpha
Added
-
Single‑instance support across the CLI by introducing a process‑level lock file.
- New
LockManagerclass usesfcntl.flockfor exclusive locking. CLIRunnernow acquires/releases the lock around command execution.LockErrorexception added for lock acquisition failures.LOCKFILE_PATHconstant defined inconstants.py.
- New
-
Comprehensive test coverage for the new locking feature.
- Unit tests verify
LOCKFILE_PATHandLockErrorbehavior. - Integration tests exercise
LockManagerandCLIRunnerunder success and failure scenarios. - End‑to‑end CLI tests confirm that only one process can run at a time.
- Exception tests updated to include lock‑related error messages.
- Unit tests verify
-
Documentation for the single‑instance feature, including architecture details, flow diagrams, and failure modes.
Fixed
- Fixed empty methods issue on apps that don't provide checksums, ensuring
passed=Falseand appropriate warnings are set in the verification result.
Release v2.3.0-alpha
Added
- Created
ProgressReporterprotocol for UI decoupling from core modules - Introduced
ServiceContainerfor dependency injection and service lifecycle management - Implemented domain-specific exception hierarchy with
MyUnicornErrorbase class:VerificationErrorwithHashMismatchError,HashUnavailableError,HashComputationErrorWorkflowErrorwithInstallError,UpdateError,PostProcessingErrorNetworkErrorwithDownloadError,GitHubAPIError- Added
is_retryableandretry_afterattributes for retry logic
- Added async file I/O support using
aiofileslibrary for non-blocking downloads - Added
NullProgressReporterimplementing null object pattern for optional progress tracking - Added comprehensive Raises sections to all public method docstrings in workflow modules for better error documentation
- Added async safety documentation to class docstrings explaining thread safety and concurrent access patterns
- Enhanced in-memory caching documentation with performance metrics and thread safety notes
- Extended
app_state_v2.schema.jsonwith new verification fields for enhanced state tracking:overall_passed: Boolean indicating if any verification method succeededactual_method: Enum (digest|checksum_file|skip) indicating which method was usedwarning: Optional warning message for unverified installationsmethods[].digest: Alternative single hash field (replaces separate computed/expected)
- Extended
cache_release.schema.jsonwithchecksum_files[]array for caching downloaded checksum files:- Stores source URL, filename, algorithm, and hash mappings
- Enables verification reuse without re-downloading checksum files
- Added
get_checksum_files(),has_checksum_files(), andget_checksum_file_for_asset()methods toCacheManager - Test support for bulk updates and stronger CLI coverage
- Added
test_update_all_cmdand a--update-alltest flag inscripts/test.pyto validate "update all" workflows.
- Added
- Significant test coverage increases and reorganization
- Dozens of focused unit tests added across progress, verification, update and utils (representative files:
tests/core/progress/test_ascii_format.py,test_ascii_sections.py,test_ascii_output.py,test_display_id.py). - Tests reorganized for clearer scopes and faster discovery (see
tests/cli/,tests/core/,tests/config/,tests/utils/). - Added 100+ tests covering schema validation, cache operations, and verification workflows
- Dozens of focused unit tests added across progress, verification, update and utils (representative files:
Changed
- setup.sh script renamed to install.sh and updated installation commands:
- Production install command updated:
- Use
./install.sh -ior./install.sh --installto perform a standard installation.
- Use
- Development install command updated:
- Use
./install.sh -eor./install.sh --editableto install in editable mode.
- Use
- Production install command updated:
- Refactored core architecture to use dependency injection via
ServiceContainer - Replaced UI dependencies in core modules with protocol-based abstractions (
ProgressReporter) - Refactored
DownloadServiceandVerificationServiceto useProgressReporterprotocol - Replaced generic exceptions with domain-specific error types across all workflow modules
- Added retry logic for transient network errors using
is_retryableexception attribute - Moved blocking I/O operations to executor threads for non-blocking async execution
- Improved docstring quality across install.py and update.py workflow modules
- Standardized exception documentation with detailed error conditions and scenarios
- Implemented async file I/O for improved download performance with
aiofiles - Reduced event loop blocking during downloads and verification operations
- Moved hash computation to executor threads for large files (>100MB threshold)
- Improved progress reporting smoothness with non-blocking updates
VerificationServicenow passes checksum file data toCacheManagerfor persistence- Update workflow recalculates verification state with fresh hashes instead of preserving stale data
- Enhanced
StateVerificationandVerificationMethodTypedDicts with comprehensive docstrings - Large internal refactors to improve modularity and maintainability
- Verification: replaced the monolithic checksum parser with a
checksum_parser/package (specialized parsers + detector/normalizer) and split the verification service into focused modules (detection, helpers, execution, verification methods).- Result:
service.pyshrank from ~1322 → 437 lines; multiple mypy issues fixed.
- Result:
- Update & logging subsystems decomposed into smaller modules:
update.pysplit intocontext.py,catalog_cache.py,manager.py,workflows.py.logger.pysplit into 6 focused modules while preserving the singleton API via re-exports.- Fixes and test updates made during the split (no behavioral changes to public CLI).
- Progress/display rework — moved from
uitocore/progressand extracted many helpers (ascii_format,ascii_sections,ascii_output,display_id,display_registry,display_logger,display_session,display_workflows).- Keeps prior public behavior while improving SRP, testability and code size.
- Import paths updated throughout CLI and tests.
- Verification: replaced the monolithic checksum parser with a
- Documentation & housekeeping
- UI docs clarified and examples expanded (
docs/ui.md). - Minor repo maintenance:
.gitignoreandAGENTS.mdimproved for clarity.
- UI docs clarified and examples expanded (
Fixed
- Critical Bug Fix: Hash Detection in Checksum Verification
- Fixed a critical bug where hexadecimal checksums were incorrectly processed as base64, causing hash detection failure called
binascii.Error: Incorrect paddingduring verification for certain apps (e.g., Heroic, QOwnNotes) that use latest-linux.yml file with hex hashes. - This fix ensures that the normalization function correctly detects and processes both hex and base64 encodings, preventing corruption of hex hashes and allowing all verification methods to function properly.
- Hex hashes (e.g., from Heroic, QOwnNotes) are now preserved without corruption
- Base64 hashes (e.g., from Legcord, Superproductivity) continue to work correctly
- Fixed a critical bug where hexadecimal checksums were incorrectly processed as base64, causing hash detection failure called
- Fixed update command not refreshing verification data when updating to new versions
- Fixed
VerificationErrornot being raised when all verification methods fail - Fixed checksum file references not persisting to cache JSON files
- Corrected asynchronous and protocol issues in progress reporting
ProgressReporterprotocol methods madeasync def;NullProgressReporterand related callers updated; added protocol-compliance tests.
- Reliability fixes in post-download and verification flows
- Guarded hash-retrieval in
PostDownloadProcessorand improved null-safety checks.
- Guarded hash-retrieval in
- Test and typing fixes uncovered by the refactors
- Multiple test failures resolved (including patched instantiation sites for
DownloadService/PostDownloadProcessor);test_update.pysuite fully passing after fixes.
- Multiple test failures resolved (including patched instantiation sites for
Removed
- Legacy venv-wrapper.bash script and install functionality removed from install.sh.
- Removed legacy/monolithic and obsolete modules
- Deleted legacy
checksum_parser.py(replaced by the newchecksum_parser/package). - Removed old monolithic
update.py/logger.pyimplementations (functionality preserved in new modules). - Deleted obsolete UI helper
src/my_unicorn/ui/display_common.pyand other unused legacy files. - Removed several deprecated test-package
__init__files as the test layout was modernized.
- Deleted legacy
Notes
- All new schema fields are optional for backward compatibility
- Existing app state configurations continue to work without migration
- Legacy verification format (passed + methods only) remains valid
Release v2.2.1-alpha
Fixed
- Fixed issue with remove command not handling missing app configs gracefully.
Release v2.2.0-alpha
Added
- Added mypy to development dependencies for type checking.
- Added tests for SHA1 and MD5 verification across multiple checksum file formats.
- Added unit tests for CLI command helpers and display functions.
Changed
- Replaced custom version comparison logic with the packaging library.
- Updated command references from 'list' to 'catalog' for consistency.
- Updated catalog loading methods in tests for better alignment.
- Cleaned up catalog and configuration management code.
- Streamlined verification and checksum parsing logic.
- Moved infrastructure modules to the core package for better organization.
- Enhanced command handlers with shared helper functions.
- Moved remove service to core/remove.py for better modularity.
- Moved display_remove.py service to remove.py for simplification.
- Enhanced remove service with dataclass for structured results.
Fixed
- Fixed remove command by adding v2 config support.
- Fixed attribute error in install command by adding explicit keyword argument to progress_service.
Removed
- Removed unused imports and redundant code in various modules.
- Eliminated deprecated methods and classes related to removal logic.
Release v2.1.0-alpha
Added
- Implemented copy_update_script function to copy the update script to a shared location.
- Integrated the script copying into installation and update processes for UV tool.
- Added warnings for missing autocomplete helper and update script.
Changed
- Change upgrade command options from
--check-onlyto--check. - Update bash and zsh autocomplete scripts to reflect new option.
- Modify update script to remove automatic upgrade handling.
- Enhance upgrade command to check for updates without installing.
- Refactor version comparison logic to improve accuracy.
- Moved asset validation functions to utils/asset_validation.py for better modularity.
- Consolidated version extraction logic into infrastructure/github/version_utils.py.
- Updated domain types to use shared utility functions for file type checks.
- Removed redundant utility functions from utils.py to streamline the codebase.
- Clarified testing instructions to specify CLI code changes.
- Added note about the
my-unicorn-updatescript for UV installations. - Updated installation commands to reflect the correct repository.
Release v2.0.0-alpha
Breaking Changes
- Config Module Refactor: Removed backward compatibility classes from config module
DirectoryManagerclass removed - usePathsclass insteadCatalogManageralias removed - useCatalogLoaderdirectly- Import paths remain the same:
from my_unicorn.config import Paths, CatalogLoader - All functionality preserved through
Pathsclass static methods
- Config Format Migration: Application configuration format changed from v1.0.0 to v2.0.0
- Manual migration required via
my-unicorn migratecommand before use - Automatic backups created during migration (.json.backup files)
- Config v2 uses hybrid structure: catalog apps store only state + catalog_ref, URL apps store full config in overrides
- Manual migration required via
- Global Config: Global configuration version updated to 1.0.2
- Command Rename:
listcommand deprecated in favor ofcatalogcommand (removed entirely)
Added
- JSON Schema Validation: Comprehensive validation for catalog and app state configurations
- Auto-detection of v1 vs v2 config formats
- Runtime validation at load/save operations
- Clear error messages with JSON path references
- IDE support via .schema.json files
- App Descriptions: Added descriptions for all 27 catalog applications
- Catalog Command: Enhanced
catalogcommand with app descriptionscatalog --availableshows apps with descriptionscatalog --info <app-name>displays detailed app information
- Migration Infrastructure: Complete v1→v2 migration system
- Dedicated
migration/package with modular structure - Automatic backup creation before migration
- Support for both catalog and URL-installed apps
- Post-migration validation with schema checking
- Dedicated
- Verification Warnings: Installation proceeds with warnings when no verification methods available
- Clear security warnings for users
- Progress display shows ⚠ symbol for unverified installs
- Detailed logging for debugging
Changed
- Setup.sh Update: Remove editable mode on legacy installation from setup.sh
- Upgrade Process Update: Use 'uv tool upgrade' command and enhance test coverage
- Documentation Enhancement: Enhanced readme, updated todo.md, and added comprehensive config documentation
- Config Structure: New hybrid v2 configuration format
- Catalog apps: Minimal config (state + catalog_ref pointing to catalog filename)
- URL apps: Full config stored in overrides section
- Improved separation of concerns and reduced duplication
- Verification State: Enhanced verification tracking in app state
- Multiple verification methods tracked per installation
- Detailed status for each method (type, algorithm, hashes, source)
- Properly saves
passed: falsewhen no verification occurs
- Icon State: Improved icon state tracking
- Method field indicates extraction vs download
- Accurate migration from v1 extraction boolean
- Icon Handling: Refactored to extract icons from AppImage only (no external download)
- Removed download method from icon handling
- Catalog JSON files updated to remove download_url entries
- New extract_icon_from_appimage() function in file_ops.py
- Migration Organization: Refactored migration code into dedicated package
migration/base.py- Common utilitiesmigration/app_config.py- App config migrationmigration/catalog_config.py- Catalog config migrationmigration/global_config.py- Global config migration- Eliminated code duplication
- Command Refactoring: Renamed deprecated
listcommand tocatalogwith enhanced features- Use new
catalogcommand instead oflist
- Use new
- Logging Improvements: Replaced print statements with logger for CLI output
- Introduced SimpleConsoleFormatter for clean console messages
- Improved logging consistency and error reporting
Fixed
- Icon Migration: Fixed v1→v2 migration incorrectly setting icon.method to "download"
- Now correctly checks source field first, then falls back to extraction boolean
- Affects apps like tagspaces, super-productivity with extraction+URL
- Catalog App Verification: Fixed checksum_file verification not preserved during migration
- Migration now consults catalog for correct verification method
- Apps like standard-notes properly migrated
- URL Install Config: Fixed URL-installed apps creating empty overrides in source fields
- Now properly populates source section in overrides
- Migration Command: Fixed migrate command failing on v1 configs
- Now reads raw JSON directly instead of using load_app_config validation
- Catalog Reference: Fixed catalog apps incorrectly migrated as URL apps
- catalog_ref now maps to catalog filename (app_name), not repo name
- No overrides added to catalog apps during migration
- Beekeeper Studio Naming: Fixed wrong catalog filename from beekeper-studio to beekeeper-studio
- Icon Method Mapping: Fixed deprecated download method mapping during migration
- Backup Migration: Removed automatic migration, now fully folder-based structure
- Install Verification Source: Fixed verification source field to use lowercase
Removed
- Legacy Config Support: Removed support for v1 configuration format
- Post-migration, only v2 configs accepted
- Simplifies codebase and maintenance
- List Command Alias: Completely removed
listcommand- Use new
catalogcommand instead - No backward compatible alias maintained
- Use new
- Old Migration Code: Removed legacy migration code from main modules
- All migration logic now in dedicated
migration/package - Cleaner separation of concerns
- All migration logic now in dedicated
- Icon Download Logic: Completely removed icon download functionality
- Now extracts icons directly from AppImage files
- Removed download_url entries from all catalog configurations
- Backup Migration: Removed automatic migration from old flat backup format to folder-based structure
- Users with old backups (*.backup.AppImage) should manually reorganize them if needed
- New installations and users who already migrated are unaffected
- Backup system now exclusively uses folder-based structure with metadata.json
- Show Progress Parameter: Removed show_progress parameter from download methods
- Progress always enabled for install/update operations
- Download progress conditionally shown based on file size
- Deprecated Classes: Removed old icon handler classes and unused tool scripts
- Deprecated Progress Methods: Removed deprecated task creation methods from progress service
Migration Guide
Migrating from v1.x to v2.0.0
-
beekeeper-studio name:
- (Recommended) If you use beekeeper-studio, remove the app before migration to v2.0.0 and reinstall after migration to avoid issues.
- You can manually rename your config and desktop files for Beekeeper Studio if you migrated before reinstalling:
- Rename
~/.config/my-unicorn/apps/beekeper-studio.jsontobeekeeper-studio.json. - Rename
~/.local/share/applications/beekeper-studio.desktoptobeekeeper-studio.desktop. - Update
catalog_reffield in the config file tobeekeeper-studio.
- Rename
-
Run migration command:
my-unicorn migrate
-
Migration process:
- Automatically detects v1 configs in
~/.config/my-unicorn/apps/ - Creates
.json.backupfiles before migration - Converts to v2 format with appropriate structure
- Validates migrated configs against JSON schema
- Automatically detects v1 configs in
-
After migration:
- Review migrated configs in
~/.config/my-unicorn/apps/ - Backups available in
~/.config/my-unicorn/apps/backups/ - Use
catalogcommand instead oflist(alias still works)
- Review migrated configs in
-
Config structure changes:
- Catalog apps: Only state + catalog_ref stored (metadata from catalog)
- URL apps: Full config in overrides section
- See docs/config.md for detailed v2 format documentation
For detailed migration information, see docs/config.md.
Release v1.12.2-alpha
Fixed
- Use correct uv command for upgrade.