Add a `Windows_tz` module containing a CLDR-sourced mapping table from
Windows timezone names to canonical IANA names. Update
`timedesc_of_timestamp` to resolve Windows-style timezone identifiers
(e.g. `"W. Europe Standard Time"`) via this table before constructing a
`Timedesc.Time_zone.t`, falling back to the local timezone with a
warning if resolution fails entirely.
Add a `tz` field to `rem` to carry the event's DTSTART timezone, and
introduce `timedesc_of_utc_or_timestamp_tz` to convert UNTIL timestamps
in that timezone instead of the process locale. This makes UNTIL
comparisons locale-independent for events with a known TZID.
- Add `monthly_pattern`, `simple_monthly` types and `monthly` field to
`rem`
- Implement `render_monthly` and `add_until_monthly` in `remind.ml`
- Handle `BYMONTHDAY` (P07) and nth-weekday `BYDAY` (P08) patterns in
`eventPredicates.ml`
- Add `add_months` utility for date arithmetic
- Mark P07 and P08 as implemented in documentation
- Add `overrides` field to `rem` type to hold single-event REMs from
non-cancelled overrides
- Add `is_cancelled`, `build_override_rem`, and `collect_overrides` to
process RECURRENCE-ID override events
- Replace `warn_unhandled_recurring` with `collect_overrides` in the
collector pipeline
- Fix `separate_master_and_recurrence` partition logic (swapped
`Left`/`Right`)
- Render override REMs appended to the master REM in `string_of_rem`
- Add `warn_unhandled_recurring` collector that emits a warning when
`RECURRENCE-ID` overrides are present but not yet handled, emitting
the master event as-is
- Register `warn_unhandled_recurring` in `all_collectors`
- Warn when more than one master event (no `RECURRENCE-ID`) is found for
a UID in `separate_master_and_recurrence`, using only the first
- Handle DATE+DURATION all-day events by computing end_date from
duration
- Add PUSH/POP-OMIT-CONTEXT and OMIT/SKIP support for EXDATE in
daily/weekly rendering
- Adjust UNTIL date when local time of UNTIL timestamp precedes event
start time
- Default weekly RRULE to event's own weekday when BYDAY list is empty
- Remove EXDATE check from complex-recurrence guard (handled via OMIT
now)
- Add timedesc_wd_to_ical weekday conversion utility
- Remove verbose EXDATE debug logging
- Fix minor newline in file processing log message
The `remind_sync` library was acting as a thin re-export layer. This
commit removes it entirely and moves the only non-trivial utility
(`show_error` for `Timedesc.Date.Ymd.error`) directly into
`bin/utils.ml`. Dead `[@@deriving show]` annotations on `rem`,
`week_first_day`, and `error` types are also removed.
- Add `simple_weekly` type and `weekly` field to `rem` record
- Add `exdate` field to `rem` for excluded dates
- Add `collect_exdates` collector to pipeline
- implement weekly `RRULE` handling with `BYDAY`, `INTERVAL`,
`COUNT`/`UNTIL`
- Add `render_weekly` to emit one `REM` per weekday with `UNTIL`/`*N`
- Replace `timedesc_of_date_or_datetime` with
`timedesc_of_utc_or_timestamp_local` in utils
- Refactor `get_exdates`/`get_rdates` to separate dates, datetimes and
periods; add debug logging per UID
- Wrap reminder output in try/catch in main; drop trailing newline
duplication
- Mark implemented predicates (P00–P05, P09, P12, P14) with ✅;
remove P18–P20 (ignored/deferred)