When splitting one operation into misc and tasks operations:
- Both operations now get unique ID suffixes (_misc and _tasks)
- Skip logic verifies both conditions before skipping:
1. tasks config has migrated field (isConfirmBeforeDelete)
2. misc config has NO migrated fields remaining
This prevents:
- Potential operation ID conflicts in the sync log
- Data loss in partial migration scenarios
Adds test cases for partial migration and correct skip scenarios.
Fixes inconsistency introduced in bug #6044 fix where auto-start breaks use
cycle directly but manual-start breaks still used cycle-1 adjustment.
After session 4, both auto and manual breaks now correctly trigger long break.
- Remove obsolete cycle-1 adjustment from _handleStartAfterSessionComplete
- Update test to expect cycle=4 instead of cycle=5 for long break
- Update comment to reference bug #6044 fix
- Fix TypeScript type errors in test file (as any assertions)
Adds explicit validation for the {day, duration} payload structure used by
logFocusSession action. This prevents the false positive warning about
"unusual structure" while maintaining correct validation for all other
METRIC operations. The specialized payload format is intentional for
append-only focus session logging.
Tags in the selection menu (shown when adding/editing tasks) now
respect the custom order defined in the left panel navigation instead
of being sorted alphabetically.
The component now uses MenuTreeService.buildTagViewTree() to maintain
user-defined ordering, including tags within folders. This provides
consistent UX between the navigation panel and tag selection dialogs.
Fixes#6046
Relates to #6044
Added comprehensive E2E tests to verify the correct Pomodoro break pattern:
- Sessions 1-3 should trigger short breaks
- Session 4 should trigger a LONG break (critical test for bug #6044)
- Session 5 should trigger a short break (not long)
- Session 8 should trigger a LONG break (second cycle)
**Test Coverage:**
- Individual test for long break after 4th session
- Individual test for short break after 5th session
- Individual test for long break after 8th session
- Full pattern verification: S S S L S S S L
**Test Structure:**
The tests follow the existing E2E test patterns and include:
- Helper functions for common operations (openFocusModeWithTask, startFocusSession, etc.)
- Break type detection to verify short vs long breaks
- Screenshot capture for visual verification
- Console logging for debugging and verification
**Additional Changes:**
- Added screenshots/ directory for test artifacts
- Updated e2e/.gitignore to exclude generated screenshots
These E2E tests complement the 131 passing unit tests to ensure the bug fix works correctly in the actual application.
The tray icon was jumping between showing task time and focus session time
when focus mode was active with a task being tracked. This occurred because
the tray display logic didn't know which focus mode was active.
Changes:
- Send focus mode type (Countdown/Pomodoro/Flowtime) from frontend to Electron
- Update IPC handler to receive and pass focus mode type to tray message creation
- Implement three-mode priority logic in createIndicatorMessage():
1. Countdown/Pomodoro modes: Show focus session countdown timer
2. Flowtime mode: Show task estimate or title (no timer)
3. No focus mode: Show normal task time (existing behavior)
- Update TypeScript type definitions for updateCurrentTask()
- Update unit tests to mock the new mode() signal
This ensures the tray displays the correct timer without jumping based on
the active focus mode, matching the behavior of the overlay indicator.
Fixes jumping tray indicator during focus mode + tracking
Converts setTaskBarProgress$ effect from selector-based to action-based
with 500ms throttling to prevent excessive IPC calls. The selector-based
effect was firing on every timer tick (1s), causing the Windows taskbar
progress bar to fill completely every second instead of gradually over
the session duration.
Fixes#6061
Fixes#6042 where app wouldn't launch from taskbar when minimize to tray
was enabled. The second-instance handler now uses showOrFocus() which
properly handles both hidden and minimized windows, matching the behavior
of the tray icon click handler.
Adds a secondary "End Focus Session" button to the focus banner when a session completes, allowing users to completely exit focus mode and dismiss the banner instead of only being able to start a break or next session.
Change trigger from pull_request to pull_request_target to allow the
workflow to run with write permissions even for external contributors.
This fixes the "Actor has insufficient permissions" error.
Also add condition to skip draft PRs to reduce API usage.
The deleteTask() helper was clicking the confirmation dialog Delete
button but not waiting for the dialog to actually close. This caused
a race condition where tests would immediately check for the undo
snackbar before it could appear, leading to timeouts.
The fix adds a proper wait for the dialog container to be hidden
after clicking Delete, ensuring the close animation completes and
NgRx effects have time to dispatch the snackbar action.
Fixes CI E2E workflow failure in "Undo task delete syncs restored
task to other client" test.
Fixes#6052
Add null-safety checks to all 15 config selectors to handle
undefined state during app initialization. Prevents crash when
selector-based effects fire before loadAllData completes.
Changes:
- Add nullish coalescing operator to all selectors
- Return DEFAULT_GLOBAL_CONFIG values when state is undefined
- Add 26 unit tests for undefined state handling
All tests pass (41/41). No breaking changes to API or behavior.