aboutsummaryrefslogtreecommitdiff
path: root/modules/agenda-query.el
Commit message (Collapse)AuthorAgeFilesLines
* feat(agenda): add the renderer output profile and its cache fileCraig Jennings2026-07-311-6/+102
| | | | | | | | | | | | | | | | | | The surface that reads this went live, and it reads a different shape than the canonical profile emits. - cj/agenda-render-json adds s and e in epoch milliseconds, plus t for the title. The canonical fields ride along, so one file serves both readers. - Every row gets an end it can be drawn with. An all-day entry spans its day. A point event has zero width. The canonical profile still reports null there, which is faithful to the source but not a width. - cj/agenda-render-cache-update writes today to the XDG cache path. Input stays epoch seconds on both profiles. Only the output converts, and the guards that catch a milliseconds-for-seconds caller still apply. Nothing schedules the cache write yet, so the file is only as fresh as its last call. Picking a refresh mechanism is its own decision.
* feat(agenda): query the agenda window as JSON for external renderersCraig Jennings2026-07-311-0/+501
I need the agenda drawable from outside Emacs, on a 24-hour axis that refreshes every few minutes. - cj/agenda-window-json returns every entry intersecting an epoch-second window. - Epoch seconds keep timezone out of the interface. The consumer converts per city, so DST weeks stop being a special case. - Repeating entries expand to one row per occurrence through org's own arithmetic, so they land where my agenda shows them. - Given an out-path it writes atomically. A reader on a timer never sees a half-written file. - It skips archived and commented subtrees, as the agenda does. The trap: SCHEDULED and DEADLINE are properties on the planning element, not children in the parse tree. Mapping over 'timestamp returns neither, and does it silently. An agenda is mostly made of those two. The tests pin it with a fixture carrying no body timestamp.