Round 109: Add 20 calendar, diary & timeclock commands

ober

05360bac41373ecceb04b1339f3e9bf7c7a2b94c

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index 5eadbaf..1bc1715 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -3689,6 +3689,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | shr-next-link | :orange_circle: | Move to next SHR link |
 | shr-previous-link | :orange_circle: | Move to previous SHR link |
 
+### Round 109 — Calendar, Diary & Timeclock
+
+| Command | Status | Description |
+|---------|--------|-------------|
+| calendar-forward-day | :orange_circle: | Move forward one day |
+| calendar-backward-day | :orange_circle: | Move backward one day |
+| calendar-forward-week | :orange_circle: | Move forward one week |
+| calendar-backward-week | :orange_circle: | Move backward one week |
+| calendar-beginning-of-week | :orange_circle: | Move to beginning of week |
+| calendar-end-of-week | :orange_circle: | Move to end of week |
+| calendar-beginning-of-month | :orange_circle: | Move to beginning of month |
+| calendar-end-of-month | :orange_circle: | Move to end of month |
+| calendar-goto-date | :orange_circle: | Jump to specific date |
+| calendar-unmark | :orange_circle: | Clear all calendar marks |
+| calendar-phases-of-moon | :orange_circle: | Show moon phases |
+| calendar-print-day-of-year | :orange_circle: | Show day of year |
+| timeclock-change | :orange_circle: | Change timeclock project |
+| timeclock-status-string | :orange_circle: | Show timeclock status |
+| timeclock-reread-log | :orange_circle: | Reread timeclock log |
+| timeclock-workday-remaining | :orange_circle: | Show remaining workday time |
+| calendar-count-days-region | :orange_circle: | Count days in region |
+| calendar-goto-iso-date | :orange_circle: | Jump to ISO date |
+| calendar-goto-hebrew-date | :orange_circle: | Jump to Hebrew date |
+| calendar-goto-islamic-date | :orange_circle: | Jump to Islamic date |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 678d6c6..28394fb 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -13749,3 +13749,53 @@
 (def (cmd-shr-previous-link app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "SHR: moved to previous link")))
+
+;;; ——— Round 109: Calendar, diary & timeclock (batch 2) ———
+
+(def (cmd-calendar-phases-of-moon app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: showing phases of the moon")))
+
+(def (cmd-calendar-print-day-of-year app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: showing day of year")))
+
+(def (cmd-timeclock-change app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Change to project: "
+      (lambda (project)
+        (echo-message! echo (str "Timeclock: changed to project " project))))))
+
+(def (cmd-timeclock-status-string app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Timeclock: showing current status")))
+
+(def (cmd-timeclock-reread-log app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Timeclock: reread log file")))
+
+(def (cmd-timeclock-workday-remaining app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Timeclock: showing workday time remaining")))
+
+(def (cmd-calendar-count-days-region app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: counting days in region")))
+
+(def (cmd-calendar-goto-iso-date app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "ISO date (YYYY-MM-DD): "
+      (lambda (date)
+        (echo-message! echo (str "Calendar: jumped to ISO date " date))))))
+
+(def (cmd-calendar-goto-hebrew-date app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Hebrew date: "
+      (lambda (date)
+        (echo-message! echo (str "Calendar: jumped to Hebrew date " date))))))
+
+(def (cmd-calendar-goto-islamic-date app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Islamic date: "
+      (lambda (date)
+        (echo-message! echo (str "Calendar: jumped to Islamic date " date))))))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 8310d01..2ff66fa 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -14314,3 +14314,47 @@
 (def (cmd-elfeed-db-compact app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Elfeed: compacting database")))
+
+;;; ——— Round 109: Calendar, diary & timeclock (batch 1) ———
+
+(def (cmd-calendar-forward-day app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: moved forward one day")))
+
+(def (cmd-calendar-backward-day app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: moved backward one day")))
+
+(def (cmd-calendar-forward-week app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: moved forward one week")))
+
+(def (cmd-calendar-backward-week app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: moved backward one week")))
+
+(def (cmd-calendar-beginning-of-week app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: moved to beginning of week")))
+
+(def (cmd-calendar-end-of-week app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: moved to end of week")))
+
+(def (cmd-calendar-beginning-of-month app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: moved to beginning of month")))
+
+(def (cmd-calendar-end-of-month app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: moved to end of month")))
+
+(def (cmd-calendar-goto-date app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Go to date (M/D/Y): "
+      (lambda (date)
+        (echo-message! echo (str "Calendar: jumped to " date))))))
+
+(def (cmd-calendar-unmark app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Calendar: cleared all marks")))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 005e315..5b201a1 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -3722,4 +3722,25 @@
   (register-command! 'shr-copy-url cmd-shr-copy-url)
   (register-command! 'shr-next-link cmd-shr-next-link)
   (register-command! 'shr-previous-link cmd-shr-previous-link)
+  ;; Round 109: Calendar, diary & timeclock
+  (register-command! 'calendar-forward-day cmd-calendar-forward-day)
+  (register-command! 'calendar-backward-day cmd-calendar-backward-day)
+  (register-command! 'calendar-forward-week cmd-calendar-forward-week)
+  (register-command! 'calendar-backward-week cmd-calendar-backward-week)
+  (register-command! 'calendar-beginning-of-week cmd-calendar-beginning-of-week)
+  (register-command! 'calendar-end-of-week cmd-calendar-end-of-week)
+  (register-command! 'calendar-beginning-of-month cmd-calendar-beginning-of-month)
+  (register-command! 'calendar-end-of-month cmd-calendar-end-of-month)
+  (register-command! 'calendar-goto-date cmd-calendar-goto-date)
+  (register-command! 'calendar-unmark cmd-calendar-unmark)
+  (register-command! 'calendar-phases-of-moon cmd-calendar-phases-of-moon)
+  (register-command! 'calendar-print-day-of-year cmd-calendar-print-day-of-year)
+  (register-command! 'timeclock-change cmd-timeclock-change)
+  (register-command! 'timeclock-status-string cmd-timeclock-status-string)
+  (register-command! 'timeclock-reread-log cmd-timeclock-reread-log)
+  (register-command! 'timeclock-workday-remaining cmd-timeclock-workday-remaining)
+  (register-command! 'calendar-count-days-region cmd-calendar-count-days-region)
+  (register-command! 'calendar-goto-iso-date cmd-calendar-goto-iso-date)
+  (register-command! 'calendar-goto-hebrew-date cmd-calendar-goto-hebrew-date)
+  (register-command! 'calendar-goto-islamic-date cmd-calendar-goto-islamic-date)
 )