Changelog, README link, countdown: 5min→3min 1/min, 3min→1min every 30s

- Add CHANGELOG.md with recent features and changes
- README: add Changelog section referencing CHANGELOG.md
- Countdown flash: 5min→3min once per minute, 3min→1min every 30s, last minute unchanged

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leopere 2026-02-07 16:39:07 -05:00
parent b2f3cd42b2
commit 70e57ac05a
Signed by: colin
SSH Key Fingerprint: SHA256:nRPCQTeMFLdGytxRQmPVK9VXY3/ePKQ5lGRyJhT5DY8
3 changed files with 35 additions and 6 deletions

22
CHANGELOG.md Normal file
View File

@ -0,0 +1,22 @@
# Changelog
All notable changes to Pommedoro are documented here.
## Unreleased
### Added
- **Work log** — Today's work log view (menu: View Work Log) with intervals, intent, reflection, and suggestion feedback. Permanent log file at `~/Documents/pommedoro/worklog.log`; in-app view shows today only. Copy and "Back to Work" from the log screen.
- **Intent pre-fill** — On the "Ready when you are" reflection/planning screen, the "What do you intend to work on next?" field is pre-filled with your current or last intent from today's log.
### Changed
- **Pause / Resume** — Menu bar item toggles to "Resume" when paused; state is visible at a glance.
- **Back to work** — "Pause" and "Continue" from the break/ready overlay no longer reset the countdown when you're mid-interval; remaining time is preserved.
- **Countdown flash schedule** — From 5 minutes: one flash per minute until 3 minutes, then every 30 seconds until 1 minute, then the existing last-minute pattern (every 10s → 5s → 2s, last 5s solid). See [README.md](README.md#phase-1-escalating-awareness).
### Technical
- Countdown pulse logic moved into `CountdownPulseSchedule`; shared by work and break.
- `KeyableWindow` for overlay text input (reflection/intent fields).
- Break flow: suggestion feedback, wellness reflection, then reflection + intent screen with Pause | Finish Day | Continue.

View File

@ -78,6 +78,11 @@ The actionable suggestions matter too. "Take a break" is an instruction with no
- **Launch at Login** via macOS LaunchAgent
- **Native macOS app** — no Electron, no web views, just AppKit
## Changelog
See [CHANGELOG.md](CHANGELOG.md) for release history and recent changes.
## Install
Download the latest DMG directly:

View File

@ -1,7 +1,7 @@
import Foundation
/// Single source of truth for countdown pulse timing. Used by both default and debug modes
/// First 30s: blink every 10s; next 15s: every 5s; next 10s: every 2s; last 5s: solid.
/// 5 min3 min: once per minute; 3 min1 min: every 30s; last minute: every 10s5s2s; last 5s: solid.
enum CountdownPulseSchedule {
/// Whether we are in the "flashing" phase (remaining within countdown window).
@ -10,14 +10,16 @@ enum CountdownPulseSchedule {
return remainingSeconds <= effective && remainingSeconds > 0
}
/// Whether to trigger a blink this second. Same logic for debug and default.
/// First 30s remaining: every 10s; next 15s: every 5s; next 10s: every 2s; last 5s: solid.
/// Whether to trigger a blink this second.
/// 5 min3 min: once per minute; 3 min1 min: every 30s; last minute: every 10s, then 5s, then 2s; last 5s: solid.
static func shouldBlink(remainingSeconds: Int) -> Bool {
let s = remainingSeconds
if s <= 5 { return false } // last 5: solid
if s <= 15 { return s % 2 == 0 } // next 10: every 2s (14,12,10,8,6)
if s <= 30 { return s % 5 == 0 } // next 15: every 5s (30,25,20,15)
return s % 10 == 0 // first 30: every 10s (60,50,40,30,)
if s <= 15 { return s % 2 == 0 } // 615: every 2s
if s <= 30 { return s % 5 == 0 } // 1630: every 5s
if s <= 60 { return s % 10 == 0 } // 3160: every 10s (last minute)
if s <= 180 { return s % 30 == 0 } // 61180: every 30s (last 3 min)
return s % 60 == 0 // 181300: once per minute (5 min 3 min)
}
/// When remaining <= 5, show solid overlay instead of blinking.