Conversation
…product (#394) * Move coordinator to separate file * Move services from init to services * Update typing * Add KeymasterEntity * Add Text Entities * Update KeymasterLock data model * Change to one Coordinator for entire integration * Update for new data model * Add property to link entity to coordinator data * Connect to Z-Wave and move to config_entry_id as key Rename KeymasterLock entities from lock to kmlock Rename KeymasterLock parent to parent_name * Add additional Code Slot Active Binary Sensors * Fix via_device * Remove use of keymaster_device_id * Write PIN changes to lock and sync children
* Add Number entities * Add Switch Entities * Remove converted helpers, scripts, automations * Fix enabled switch * Add datetime and time entities * Store kmlocks in JSON file * Build Code Slot is active logic * Add limit by time of day switch * Use zwave_js_server for usercode updates * Refine active/enabled logic * Code cleanup * Update Listeners * Sync Lock and Door Statuses * Auto Lock Timer * Rename door/lock status to state * Fix circular imports with type annotations Redo json import code * Complete Auto Lock Timer * Add notifications * Update config and options flow * Delete unused code slot entities on update * Code Cleanup
* Fix ValueError when clearing PIN * Keep entities available when slot not enabled * Add Code Slot Sync Status Sensor * Code Cleanup * Refresh in 15 seconds after PIN changes
… if door sensor set (#403) * Only add Door Notifications and Retry Lock if door sensor set * Add Icons * Add Override Parent Logging
* Further logic refinement * Lovelace refinements
* Delete Lovelace on Lock Delete * Delete config file on coordinator delete
* Add Notify Script to config flow * Filter out already used locks and Config flow cleanup
* Remove unused config fields * Remove unused yaml * Update ConfigEntry to Version 3 * Remove unused functions * Update Z-Wave JS Client * Combine all config into pyproject.toml * Update conftest.py * Limit test files for now * Change to ruff * Linting cleanup * Update pytest.yaml * Update test_config_flow.py * init and config_flow changes to pass pytest
* Linting Cleanup * More complicated linting cleanup * Update pyproject.toml * Update .gitignore
* Fix config_flow * Remove assertions * Initialize code_slot and dow to None * Update ruff for Py3.13 and Fix/Format
* Show Code Slot Name in Unlock Notifications * Only trigger changes when state actually changes * Use activity map to standardize event name
* Add none option for notification scripts * Change to none for all options * Add additional typing * Linting * Variable naming cleanup * Fix Entity Naming * Clarify datetime entities vs import * Handle dictionary changed size during iteration errors * Check usercode after clearing code slot * Keep pin when reconfiguring
Line 834 added. The initial message string was missing, causing an exception that killed the notification. This effectively disabled all code-specific notifications and required the use of global notifications.
* fix: switch to reconfigure flow, fix tests * linting and formatting * remove commented lines * update more tests * more test updates
* Cleans up _most_ of the issues that pre-commit hooks found. * Adds in a .pre-commit-config.yaml file that can be used in conjuction with pre-commit (see pre-commit.com) and the pre-commit GitHub Action integration (see pre-commit.ci) * Many of the pre-commit hooks were disabled as they were going to require significant changes to the codebase. Signed-off-by: Andrew Grimberg <tykeal@bardicgrove.org>
* Feat: Add new schema for advanced features Add the schema and migration for being able to disable the advanced features of date range and day of week. As the features have historically been enabled by default, this migration will set the default values to True for existing installations. Signed-off-by: Andrew Grimberg <tykeal@bardicgrove.org> * Feat: Teach config flow about advanced options Teaches the config flow about the advanced options for date range and day of week. Signed-off-by: Andrew Grimberg <tykeal@bardicgrove.org> * Feat: Teach how to skip Advanced options Teach Keymaster how to skip configuration of the entities for the Advanced Date Range and Advanced Day of Week options. Signed-off-by: Andrew Grimberg <tykeal@bardicgrove.org> * Feat: Teach dashboard generator advanced toggles Teach the dashboard generator about the advanced toggles for date range and day of week. When a customer configures keymaster with these options the related entities will be appropriately added to generated dashboard output. Signed-off-by: Andrew Grimberg <tykeal@bardicgrove.org> --------- Signed-off-by: Andrew Grimberg <tykeal@bardicgrove.org>
…led (#520) (#521) * Fix: Child locks stuck in 'Deleting' when parent slot disabled - Treat disabled/inactive parent slots as having no PIN for comparison - Prevents infinite sync loop when parent slot disabled but retains PIN value - Fixes issue #520 When a parent slot is disabled, the PIN text field may still contain a value. The sync logic was comparing this stale PIN against cleared child slots, causing false mismatch detection and endless clear loops. Now uses parent_pin_for_comparison which is None when parent slot is disabled or inactive, allowing proper sync status for child locks. This is a follow-up to PR #515 which fixed Schlage masked response issues. * Add unit tests for disabled slot sync fix (#520) - Test disabled parent slot with PIN doesn't cause mismatch - Test inactive parent slot with PIN doesn't cause mismatch - Test enabled+active parent continues normal sync - Test matching parent/child PINs show no mismatch - Test masked child responses are ignored (PR #515) - Adds 6 test cases covering new parent_pin_for_comparison logic - Should improve code coverage for coordinator.py
* Fix KeyError in _rebuild_lock_relationships When removing orphaned children from parent's child_config_entry_ids set, the code incorrectly used 'child_config_entry_id' as the dictionary key instead of 'keymaster_config_entry_id' (the parent). This caused KeyError when the orphaned child was not present in the self.kmlocks dictionary, even though the intent was to remove it from the parent lock's child list. Line 477: Changed self.kmlocks[child_config_entry_id] to self.kmlocks[keymaster_config_entry_id] * Fix RuntimeError: Set changed size during iteration The code was modifying child_config_entry_ids set while iterating over it, causing 'RuntimeError: Set changed size during iteration'. Fixed by iterating over a list copy: list(kmlock.child_config_entry_ids) This allows the set to be safely modified during iteration. Line 469: Changed 'for child_config_entry_id in kmlock.child_config_entry_ids' to 'for child_config_entry_id in list(kmlock.child_config_entry_ids)' * Add comprehensive tests for _rebuild_lock_relationships Added 3 test cases to validate the KeyError and RuntimeError fixes: 1. test_rebuild_with_orphaned_child_not_in_kmlocks: - Tests that orphaned children (not in kmlocks dict) don't cause KeyError - Verifies orphaned children are removed from parent's child list 2. test_rebuild_with_valid_parent_child_relationship: - Tests that valid parent-child relationships are preserved - Ensures correct references remain intact 3. test_rebuild_with_mismatched_parent: - Tests that children pointing to different parents are cleaned up - Verifies removal from old parent's child list All tests pass with the fixes applied. * Add comprehensive edge case tests for _rebuild_lock_relationships Added 7 additional tests covering edge cases: 1. test_rebuild_with_multiple_orphaned_children: - Tests cleanup of multiple orphaned children at once 2. test_rebuild_with_mixed_valid_and_orphaned_children: - Verifies correct handling when parent has both valid and orphaned children 3. test_rebuild_with_empty_child_list: - Ensures empty child lists don't cause errors 4. test_rebuild_with_circular_reference_prevention: - Tests that circular parent-child references don't cause crashes 5. test_rebuild_preserves_parent_name_relationships: - Validates parent_name matching creates correct relationships 6. test_rebuild_with_child_list_as_list_not_set: - Confirms list type handling (actual type from lock.py) 7. test_rebuild_idempotency: - Verifies running rebuild multiple times produces identical results All 10 relationship tests now pass (32 tests total in suite). Coverage improved to 60.36%. * Add comprehensive parent-child sync tests Added 10 functional tests for _update_child_code_slots covering: 1. Parent disabled slot clears child 2. Parent inactive slot (time restriction) clears child 3. Parent enabled+active syncs PIN to child 4. Masked child PIN responses ignored (Schlage workaround) 5. Child override_parent flag prevents sync 6. Missing child slots handled gracefully 7. Multiple slots synced simultaneously 8. None parent PIN handled correctly 9. Empty parent code_slots doesn't crash 10. All slot attributes propagated (name, accesslimit, etc) These tests validate the PR #520 fix and ensure parent-child synchronization works correctly in all scenarios. Total test count: 42 tests Coverage: 61.34% * Add multi-lock and boundary condition tests Added 7 more functional tests covering: Multi-Lock Scenarios: 1. Multiple children syncing from same parent 2. Race condition: parent changes during sync 3. Parent with multiple children - cascading updates 4. Orphaned children from deleted parent Code Slot Boundaries: 5. Slot number 0 (edge case) 6. Slot number 250 (maximum) 7. Sparse/non-contiguous slot numbers These tests cover scenarios that could cause production issues: - Concurrent child updates from shared parent - Edge cases in slot numbering - Orphaned lock cleanup - Race conditions in sync operations * Add comprehensive child lock behavior tests (Category 3) Tests child-side behavior patterns with override flags and attribute inheritance: - Child with override_parent=True maintains independence across syncs - Child without override respects all parent state changes - Child inherits all access limit attributes (count, date range, day of week enabled) - Child effectively disabled when parent is disabled (PIN cleared) - Child behavior when switching override_parent flag on/off - Child behavior when parent slot is missing - Child inherits parent name changes Coverage: 7 new tests validate child lock behavior patterns. * Add system invariant validation and stress tests Implements comprehensive validation tests that would have caught the KeyError and RuntimeError bugs: 1. **Invariant validator helper** - Checks 5 critical system invariants: - No orphaned child references in parent lists - No invalid parent references from children - Bidirectional relationship consistency - No duplicate children in parent lists - Parent-child pointer symmetry 2. **Invariant hold tests** - Validates invariants after rebuild operations: - Simple orphaned child scenario - Complex multi-parent/multi-child hierarchies - Bidirectional consistency restoration 3. **Stress test** - Randomly adds 20 locks then removes 10, verifying no crashes
* test: comprehensive test coverage improvements (52.5% → 65%) Major test coverage expansion adding 198 passing tests across multiple modules: **New Test Files:** - test_button.py: 100% coverage of button entity platform (7 tests) - test_datetime.py: 100% coverage of datetime entity platform (9 tests) - test_entity.py: 99% coverage of base entity class (24 tests) - test_number.py: 100% coverage of number entity platform (12 tests) - test_sensor.py: 100% coverage of sensor entity platform (6 tests) - test_switch.py: 73% coverage of switch entity platform (11 tests) - test_text.py: 100% coverage of text entity platform (12 tests) - test_time.py: 100% coverage of time entity platform (13 tests) **Enhanced Test Files:** - test_coordinator.py: Added 48+ tests for event handling, sync, utilities - test_helpers.py: Added Throttle class and notification helper tests - test_services.py: Added coordinator failure path test - test_config_flow.py: Fixed 6 pre-existing test failures - test_init.py: Enhanced initialization tests **Bug Fixes:** - Fixed KeymasterTimer comparison operators (< and > were swapped) - Fixed service helper tests to use actual service registration - Removed unreachable code from time.py (redundant validation) **Code Quality:** - All tests follow pytest best practices with proper fixtures - Comprehensive edge case coverage (error paths, None values, missing data) - Proper mocking and async test patterns throughout - Added .gitignore entry for local ha-core development directory **Coverage Milestones:** - Overall: 52.5% → 65% (+12.5 percentage points) - 10 files at 100% coverage: button, const, datetime, lock, number, sensor, services, text, time (+ entity at 99%) - 198 passing tests (up from ~160), 3 skipping - All pre-existing failures resolved **Files with 100% Coverage:** - custom_components/keymaster/button.py (41 lines) - custom_components/keymaster/const.py (73 lines) - custom_components/keymaster/datetime.py (52 lines) - custom_components/keymaster/lock.py (66 lines) - custom_components/keymaster/number.py (57 lines) - custom_components/keymaster/sensor.py (40 lines) - custom_components/keymaster/services.py (22 lines) - custom_components/keymaster/text.py (55 lines) - custom_components/keymaster/time.py (73 lines) * Update tests/test_init.py * Update tests/test_init.py * Update tests/test_init.py * Update tests/test_init.py * Update tests/test_init.py * fix: move imports to top level in test_button.py * fix: move imports to top level in test_datetime.py - Moved all component imports to top of file - Removed lazy imports from inside test functions - Changed datetime import from alias 'dt' to direct 'datetime' for consistency - Fixed PLC0415 linting violations (16 violations resolved) * fix: move imports to top level in test_entity.py - Moved KeymasterLock and KeymasterCodeSlot imports to top of file - Removed all lazy imports from inside test functions (24 occurrences) - Fixed PLC0415 linting violations (24 violations resolved) * fix: move imports to top level in test files (batch 2) - test_number.py: Moved number component and lock imports (20 violations) - test_sensor.py: Moved sensor component and lock imports, plus Mock imports (12 violations) - test_switch.py: Moved switch component and lock imports (21 violations) - test_text.py: Moved text component and lock imports (20 violations) - test_time.py: Moved time component and lock imports (23 violations) - Fixed PLC0415 linting violations (96 total violations resolved in this batch) * fix: move imports to top level in test files (batch 3 - final) - test_coordinator.py: Moved LockState and STATE_* imports from nested fixtures (21 violations) - test_services.py: Moved ConfigEntryNotReady and other imports from test functions (4 violations) - Fixed PLC0415 linting violations (25 total violations resolved in this batch) All import violations now resolved across all 10 test files (161 total fixes) * fix: add missing KeymasterCodeSlotDayOfWeek import - Added KeymasterCodeSlotDayOfWeek to imports in test_time.py and test_entity.py - These were accidentally removed by the automated import cleanup script - Fixes NameError in tests using nested code slot day of week properties * refactor: optimize linter configuration - Add per-file-ignores in pyproject.toml for test files (SLF001) - Remove manual-list-comprehension and pytest-fixture-param-without-value from global ignores - Allow PT019 and PERF401 to show as informational warnings - Improve configuration organization and maintainability * fix: improve type annotations in core components - Use walrus operator for via_device type narrowing in __init__.py - Change via_device type from tuple[str, Any] to tuple[str, str] - Remove unused Any import - Fix type safety without suppressions * fix: standardize mock entity callbacks in test files - Apply consistent AddEntitiesCallback mock pattern across test files - Use 'del update_before_add' to handle unused required parameter - Fix function signatures to match HomeAssistant API expectations - Improves test reliability and removes linter warnings * refactor: improve type safety in test files - Replace string literals with Synced enum values in test_sensor.py - Add isinstance assertions for type narrowing in test_entity.py and test_time.py - Use proper getattr patterns with targeted noqa comments in tests/common.py - Eliminate unnecessary type:ignore comments through proper type handling * style: apply code quality improvements to test files - Use @pytest.mark.usefixtures decorator for cleaner test organization - Convert manual loops to list.extend() with comprehensions for better performance - Improve import organization and code clarity - Remove redundant module-level pylint disables (handled in pyproject.toml) * fix: correct parametrize parameter name in test_reconfiguration_form - Change _title to title to match parametrize decorator - Add explicit del statement to indicate intentional unused parameter - Fixes pytest collection error * fix: correct pytest fixture references - Fix enable_custom_integrations fixture name (was _enable_custom_integrations) - Remove underscore prefix from fixture names in test_config_flow.py - Fixtures are defined with name= parameter, use without underscore - Fixes pytest collection and setup errors * fix: correct pytest fixture parameter names and enum comparison - Fix mock function signature: hass, domain (not _hass, _domain) in side_effect_get_entities - Fix integration_fixture parameter: platforms (not platforms_list) - Fix keymaster_integration fixture parameters: hass, client (not _hass, _client) - Fix mock_async_call_later signature parameters - Fix coordinator fixture dependencies: button_config_entry, datetime_config_entry, entity_config_entry - Fix test_sensor enum comparison: Synced.SYNCED instead of 'synced' Resolves fixture 'not found' errors and enum assertion failures. Test results: 195 passed, 3 failed (sensor count issue), 3 skipped * fix: reduce pytest log level from DEBUG to INFO for cleaner test output DEBUG level was flooding test output with hundreds of state_changed events from Home Assistant core, making it difficult to read test results. INFO level provides a good balance between seeing important messages and avoiding spam. * fix init tests * fix broken tests and sort imports --------- Co-authored-by: Chris <1105672+firstof9@users.noreply.github.com> Co-authored-by: firstof9@gmail.com <firstof9@gmail.com>
* fix: migration fix based on new tests * formatting * linting * more linting
…eration (#536) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…gy (#543) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Fixes #547
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…rs (#553) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
#559) * address copilot comments Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * address copilot comments Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: clarify masked response comment Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Update custom_components/keymaster/providers/zwave_js.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
YAML-mode Lovelace resources don't have an 'id' field, only 'url' and 'type'. When users manually added the keymaster resource (as instructed by the warning message), the generator expression crashed on data['id'] before the StopIteration handler could run. Restructured async_register_strategy_resource to check resource existence by URL first (works for both YAML and storage modes), then branch on the result. Fixes #560 Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR merges the beta branch into main, consolidating significant development work that has occurred on beta since mid-2025. The changes represent a major architectural overhaul of the keymaster integration, including a complete rewrite of the lock provider system, migration to native Home Assistant entities, implementation of Lovelace dashboard strategies, and comprehensive test coverage improvements.
Changes:
- Introduced provider abstraction layer for lock platforms with Z-Wave JS implementation
- Migrated from YAML-based input helpers to native HA entity platforms (Text, Number, Switch, DateTime, Time, Button, Sensor, Binary Sensor)
- Implemented Lovelace dashboard/view/section strategies with TypeScript frontend
- Refactored coordinator for event-driven architecture with real-time lock event handling
- Enhanced testing infrastructure with new test files and updated CI/CD workflows
Reviewed changes
Copilot reviewed 94 out of 129 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| tests/test_coordinator_events.py | New tests for coordinator event handling with lock/unlock events and access limit decrementing |
| tests/test_button.py | New tests for button entity creation and press actions |
| tests/test_binary_sensor.py | Updated Z-Wave JS network sensor tests with improved connection handling |
| tests/providers/init.py | New provider tests package initialization |
| tests/json/zwave_js/lock_schlage_be469_state.json | Updated lock state JSON with corrected field names and expanded command class data |
| tests/json/zwave_js/controller_state.json | Updated controller state with reformatted arrays and new status fields |
| tests/json/zwave_js/controller_node_state.json | New controller node state fixture for testing |
| tests/const.py | Refactored test constants to use integration constants and updated config data structure |
| tests/common.py | Modernized imports and updated time manipulation for test utilities |
| tests/init.py | Updated docstring formatting |
| setup.cfg | Removed deprecated configuration file |
| scripts/compare_lovelace_output.py | New utility script for comparing Lovelace output between branches |
| rollup.config.js | New Rollup configuration for TypeScript compilation |
| requirements_test.txt | Reorganized test dependencies with clear categorization |
| requirements_lint.txt | New lint-specific dependencies file |
| requirements_dev.txt | Simplified to reference test and lint requirements |
| pylintrc | Removed deprecated pylint configuration |
| package.json | New package.json for TypeScript/JavaScript tooling |
| lovelace_strategy/view-strategy.ts | New TypeScript view strategy implementation |
| lovelace_strategy/view-strategy.test.ts | Comprehensive tests for view strategy |
| lovelace_strategy/types.ts | TypeScript type definitions for strategies |
| lovelace_strategy/strategy-utils.ts | Utility functions for strategy error handling |
| lovelace_strategy/slugify.ts | URL slug generation utility |
| lovelace_strategy/section-strategy.ts | New section strategy for code slot cards |
| lovelace_strategy/main.ts | Strategy registration entry point |
| lovelace_strategy/ha_type_stubs.ts | Home Assistant type definitions |
| lovelace_strategy/dashboard-strategy.ts | Dashboard-level strategy implementation |
| lovelace_strategy/dashboard-strategy.test.ts | Tests for dashboard strategy |
| lovelace_strategy/const.ts | Strategy constants |
| info.md | Formatted documentation with line breaks |
| hacs.json | Updated minimum HA version and added persistent directory |
| custom_components/keymaster/websocket.py | New WebSocket API for dashboard strategies |
| custom_components/keymaster/translations/nb.json | Updated Norwegian translations for new config flow |
| custom_components/keymaster/translations/en.json | Updated English translations for simplified config |
| custom_components/keymaster/time.py | New Time entity platform |
| custom_components/keymaster/text.py | New Text entity platform for names and PINs |
| custom_components/keymaster/system_health.py | Removed deprecated system health module |
| custom_components/keymaster/switch.py | New Switch entity platform |
| custom_components/keymaster/strings.json | Updated config flow strings |
| custom_components/keymaster/services.yaml | Updated service definitions |
| custom_components/keymaster/services.py | Refactored services to use coordinator |
| custom_components/keymaster/sensor.py | Migrated to native entity platform |
| custom_components/keymaster/resources.py | New Lovelace resource registration helpers |
| custom_components/keymaster/providers/const.py | Provider system constants |
| custom_components/keymaster/providers/_base.py | Base lock provider abstraction |
| custom_components/keymaster/providers/init.py | Provider factory and registration |
| custom_components/keymaster/providers/PROVIDERS.md | Provider development documentation |
| custom_components/keymaster/number.py | New Number entity platform |
| custom_components/keymaster/manifest.json | Added http dependency |
| custom_components/keymaster/lovelace_child.head | Removed deprecated template |
| custom_components/keymaster/lovelace_child.code | Removed deprecated template |
| custom_components/keymaster/lovelace.head | Removed deprecated template |
| custom_components/keymaster/lovelace.code | Removed deprecated template |
| custom_components/keymaster/lock.py | Expanded lock dataclass with code slots and provider |
| custom_components/keymaster/keymaster_common.yaml | Removed deprecated YAML package |
| custom_components/keymaster/keymaster.yaml | Removed deprecated YAML package |
| custom_components/keymaster/exceptions.py | Updated exception classes for provider system |
| custom_components/keymaster/entity.py | New base entity class for all platforms |
| custom_components/keymaster/datetime.py | New DateTime entity platform |
| custom_components/keymaster/const.py | Expanded constants for new architecture |
| custom_components/keymaster/button.py | New Button entity platform |
| custom_components/keymaster/binary_sensor.py | Migrated to entity platform with connection status |
| codecov.yml | New Codecov configuration for Python and TypeScript |
| autolock/autolock_definitions.yml | Formatting improvements |
| autolock/Autolock.md | Documentation formatting |
| assets/additional_yaml/ozw.yaml | Added yamllint disable comments |
| README.md | Enhanced documentation with Lovelace strategy information |
| Dockerfile.test | New Docker test environment |
| .pre-commit-config.yaml | New pre-commit hooks configuration |
| .github/workflows/yarn.yaml | New workflow for TypeScript linting and building |
| .github/workflows/vitest.yaml | New workflow for TypeScript tests |
| .github/workflows/release.yaml | Updated release workflow |
| .github/workflows/pytest.yaml | Enhanced Python CI with lint and type checking |
| .github/workflows/combined.yaml | Removed trailing whitespace |
| .github/release-drafter.yml | Fixed typo in "Enhancements" |
| .github/PULL_REQUEST_TEMPLATE.md | Formatting improvements |
| .github/ISSUE_TEMPLATE/feature_request.md | Line length formatting |
| .gitattributes | Mark generated JavaScript as linguist-generated |
| .eslintrc.cjs | New ESLint configuration |
| .coveragerc | Removed deprecated coverage configuration |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
tykeal
left a comment
There was a problem hiding this comment.
I'm just going to personally say yes to this. I think it's time especially since I think releasing off of a branch named beta isn't a really good practice!
firstof9
left a comment
There was a problem hiding this comment.
It was good while testing was underway before dropping non-prerelease versions tho
Proposed change
Merges
betaintomain. Releases have been coming from beta since mid 2025 at least so I think this is safe.Type of change
Additional information