Enhanced the inventory tab to show each benefit on its own line instead of
an icon grid. Each benefit now displays with:
- Icon (40x40px) on the left
- Benefit name and type on the right in format: "Name (TYPE)"
Changes:
- Backend: Send full benefit data (name, type, image_url) instead of just URLs
- Frontend: Render benefits as vertical list of horizontal lines
- CSS: Add new styles for benefit items (.benefit-item, .benefit-icon, .benefit-info)
- Removed: Icon grid layout (chunks of 3) and rewards text field
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add dual-mode version extraction supporting branch and file validation
- Implement comprehensive semver range validation (caret, tilde, wildcards)
- Extract release creation logic to dedicated script for reusability
- Add test suite with comprehensive coverage for validation scripts
- Update workflow to validate new version is greater than current
- Bump version to 1.1.0 in pyproject.toml to match version.py
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Extracted version extraction logic from workflows into a centralized script for better reusability and consistency. Updated validation output naming for clarity.
Changes:
- Add extract_version.sh for centralized version extraction
- Remove update_version.sh (functionality integrated into workflows)
- Update validate_semver.sh output: release_type → is_prerelease
- Refactor docker-release.yml to use extract_version.sh
- Refactor github-release.yml to use centralized scripts
- Add version duplication check in version-release.yml
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Simplify github-release workflow by removing auto-generation and linting steps
- Extract SemVer validation from inline workflow to dedicated script
- Add production environment protection to version-release workflow
- Create reusable validation and update scripts in .github/scripts/
- Update release notes for v1.1.1
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Split the monolithic publish workflow into docker-release and github-release workflows to improve separation of concerns and allow independent execution. GitHub releases now trigger as a dependent workflow after successful Docker builds.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updated CLAUDE.md to reflect the new translation access pattern and
removal of the ReloadRequest exception.
Changes:
- Updated translation usage examples to show new dict access pattern:
- Old: _("gui", "status", "idle")
- New: _.t["gui"]["status"]["idle"]
- Removed ReloadRequest from exceptions list in Key Files section
- Examples now accurately reflect the current codebase implementation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed unnecessary wrapper methods in the Twitch client and the unused
ReloadRequest exception to simplify the codebase.
Client cleanup (src/core/client.py):
- Removed unnecessary wrapper methods that just delegated to services:
- _watch_sleep() - direct call to service
- _watch_loop() - task created directly from service method
- _maintenance_task() - unused wrapper removed
- process_drops() - websocket callback uses service method directly
- process_notifications() - websocket callback uses service method directly
- process_stream_state() - websocket callback uses service method directly
- process_stream_update() - websocket callback uses service method directly
- get_priority() - direct call to service
- _viewers_key() - direct call to static method
- Changed websocket topic callbacks to use service methods directly
- Removed ReloadRequest handling from run() method
- Net reduction: ~50 lines of unnecessary delegation code
Exception removal (src/exceptions.py):
- Removed unused ReloadRequest exception class
- This exception was never actually raised in the codebase
Task wrapper update (src/utils/async_helpers.py):
- Removed ReloadRequest from exception handling
- Updated docstrings to reflect this change
Benefits:
- Simpler code: Less indirection through unnecessary wrappers
- More direct: Websocket callbacks use service methods directly
- Cleaner: Removed unused exception class
- Easier to follow: Less jumping between wrapper and actual implementation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Simplified the Translator class to be more direct and Pythonic, and
updated all translation access from callable pattern to dict access.
Translator changes (src/i18n/translator.py):
- Removed complex fallback/merging logic with English translations
- Simplified from callable pattern _("key", "subkey") to dict access _.t["key"]["subkey"]
- Removed _load_english_translation() and module-level English translation
- Changed from list of language names to dict of Translation objects
- Removed unnecessary imports (abc, json_utils, MinerException, TYPE_CHECKING)
- Made language storage and access more direct (self.t property)
- Simplified set_language() to direct dict lookup
Translation access pattern changes (all other files):
- Changed from _("key", "subkey") to _.t["key"]["subkey"] throughout codebase
- This is more Pythonic and aligns with TypedDict structure
- Applied in: __main__.py, http_client.py, auth_state.py, models/drop.py,
services (inventory, message_handlers, watch), web managers (login, settings),
websocket.py
Benefits:
- More Pythonic: Direct dict access instead of callable
- Simpler: Removed ~70 lines of complex fallback logic
- Type-safe: Direct access to TypedDict structure
- More explicit: _.t["key"]["subkey"] shows the structure clearly
- Easier to maintain: No complex merging or fallback logic
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>