<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs.git/modules/org-agenda-config.el, branch v0.7.2</title>
<subtitle>my Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2</id>
<link rel='self' href='https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/'/>
<updated>2026-02-23T11:14:21+00:00</updated>
<entry>
<title>chore: rename chime.el references to Chime</title>
<updated>2026-02-23T11:14:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-23T11:14:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=6ec4857d0c4c1f43b42bb83c355e150f1aabd4d8'/>
<id>urn:sha1:6ec4857d0c4c1f43b42bb83c355e150f1aabd4d8</id>
<content type='text'>
Update load-path, GitHub URL, and all project/package name
references to reflect the chime.el → Chime rename.
</content>
</entry>
<entry>
<title>fix(agenda): scope file scan to immediate subdirs of ~/projects</title>
<updated>2026-02-13T18:47:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-13T18:47:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=6814d0bbb3b874bbe0c2b63e242d6b8145df0a39'/>
<id>urn:sha1:6814d0bbb3b874bbe0c2b63e242d6b8145df0a39</id>
<content type='text'>
Replace recursive directory-files-recursively with shallow scan that
only checks ~/projects/*/todo.org. Excludes nested archive todo.org
files and keeps ~/code and ~/.emacs.d out of agenda.
</content>
</entry>
<entry>
<title>feat(calendar-sync): add RECURRENCE-ID exception handling for recurring events</title>
<updated>2026-02-03T13:39:50+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-03T13:39:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=84a02097bf842e96f7f4dd4e4ac39e78faf64989'/>
<id>urn:sha1:84a02097bf842e96f7f4dd4e4ac39e78faf64989</id>
<content type='text'>
Handle rescheduled instances of recurring calendar events by processing
RECURRENCE-ID properties from ICS files. When someone reschedules a single
instance of a recurring meeting in Google Calendar, the calendar-sync module
now shows the rescheduled time instead of the original RRULE time.

New functions:
- calendar-sync--get-recurrence-id: Extract RECURRENCE-ID from event
- calendar-sync--get-recurrence-id-line: Get full line with TZID params
- calendar-sync--parse-recurrence-id: Parse into (year month day hour minute)
- calendar-sync--collect-recurrence-exceptions: Collect all exceptions by UID
- calendar-sync--occurrence-matches-exception-p: Match occurrences to exceptions
- calendar-sync--apply-single-exception: Apply exception data to occurrence
- calendar-sync--apply-recurrence-exceptions: Apply all exceptions to occurrences

Also adds DeepSat calendar configuration (dcal-file) to user-constants,
init.el, and org-agenda-config.

48 unit and integration tests added covering normal, boundary, and error cases.
</content>
</entry>
<entry>
<title>feat(calendar-sync): multi-calendar support with property tests</title>
<updated>2025-12-02T13:55:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-12-02T13:55:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=fac78a8fc92b27c37e678ee70824eb5f70ceee8b'/>
<id>urn:sha1:fac78a8fc92b27c37e678ee70824eb5f70ceee8b</id>
<content type='text'>
Added multi-URL calendar sync supporting Google and Proton calendars.
Each calendar syncs to separate file with per-calendar state tracking.
Added 13 property-based tests for RRULE expansion. Total: 150 tests passing.
</content>
</entry>
<entry>
<title>refactor: Use cj/log-silently for debug messages</title>
<updated>2025-11-17T04:10:58+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-17T04:10:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=eb261131bd8652ee8565526f68bd922e7b60c70f'/>
<id>urn:sha1:eb261131bd8652ee8565526f68bd922e7b60c70f</id>
<content type='text'>
Converted debug/informational messages to use cj/log-silently instead of
message across multiple modules. These are automatic initialization or
background task messages that don't need minibuffer display but should
still be logged to *Messages* buffer.

Changes:
- org-agenda-config.el: Cache build/hit messages (4 messages)
- org-refile-config.el: Cache build/hit + mode switching (5 messages)
- org-export-config.el: reveal.js download message (1 message)
- auth-config.el: oauth2-auto cache fix message (1 message)
- quick-video-capture.el: initialization message (1 message)

All modules now require system-lib for cj/log-silently function.
Keeps UI clean while maintaining debuggability.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>perf: Merge performance branch - org-agenda cache, tests, and inbox zero</title>
<updated>2025-11-12T08:46:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-12T08:46:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=84eef1d3b1b0195a2f8fbf5b141ba5e58004c28d'/>
<id>urn:sha1:84eef1d3b1b0195a2f8fbf5b141ba5e58004c28d</id>
<content type='text'>
This squash merge combines 4 commits from the performance branch:

## Performance Improvements
- **org-agenda cache**: Cache org-agenda file list to reduce rebuild time
  - Eliminates redundant file system scans on each agenda view
  - Added tests for cache invalidation and updates

- **org-refile cache**: Optimize org-refile target building (15-20s → instant)
  - Cache eliminates bottleneck when capturing tasks

## Test Suite Improvements
- Fixed all 18 failing tests → 0 failures (107 test files passing)
- Deleted 9 orphaned test files (filesystem lib, dwim-shell-security, org-gcal-mock)
- Fixed missing dependencies (cj/custom-keymap, user-constants)
- Fixed duplicate test definitions and wrong variable names
- Adjusted benchmark timing thresholds for environment variance
- Added comprehensive tests for org-agenda cache functionality

## Documentation &amp; Organization
- **todo.org recovery**: Restored 1,176 lines lost in truncation
  - Recovered Methods 4, 5, 6 + Resolved + Inbox sections
  - Removed 3 duplicate TODO entries

- **Inbox zero**: Triaged 12 inbox items → 0 items
  - Completed: 3 tasks marked DONE (tests, transcription)
  - Relocated: 4 tasks to appropriate V2MOM Methods
  - Deleted: 4 duplicates/vague tasks
  - Merged: 1 task as subtask

## Files Changed
- 58 files changed, 29,316 insertions(+), 2,104 deletions(-)
- Tests: All 107 test files passing
- Codebase: Cleaner, better organized, fully tested

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>config: Increase chime modeline lookahead and tooltip display</title>
<updated>2025-11-11T03:02:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-11T03:02:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=b9e9b5e6a7ca09be5909298f0a208eac7b2ba4a2'/>
<id>urn:sha1:b9e9b5e6a7ca09be5909298f0a208eac7b2ba4a2</id>
<content type='text'>
Expanded chime modeline settings for better event visibility:
- Lookahead window: 3 hours → 6 hours
- Tooltip max events: 10 → 20
- Tooltip lookahead: 6 days → 7 days (full week)

Provides more advance notice of upcoming events and better weekly overview.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat:chime: Add calendar URL configuration</title>
<updated>2025-11-09T21:34:51+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-09T21:34:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=c64357f7fa0751beaa30565babec62df5232766a'/>
<id>urn:sha1:c64357f7fa0751beaa30565babec62df5232766a</id>
<content type='text'>
Set the calendar URL in chime configuration for better integration
with Google Calendar. Debug mode remains available but disabled by
default.
</content>
</entry>
<entry>
<title>feat: Fix modeline lag and add org multi-level sort with comprehensive tests</title>
<updated>2025-11-08T22:11:58+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-08T22:11:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=8176eff73b826f7fec9d7f458f7d2f36f4d12e58'/>
<id>urn:sha1:8176eff73b826f7fec9d7f458f7d2f36f4d12e58</id>
<content type='text'>
Performance improvement and new feature with full test coverage.

## Changes

### 1. Fix modeline line/column position lag (#A priority)
- Replace expensive line-number-at-pos with cached %l/%c format specifiers
- Enable line-number-mode explicitly for caching
- Result: Instant modeline updates, zero performance overhead
- Files: modules/modeline-config.el:81-83, modules/ui-config.el:53

### 2. Implement multi-level org sorting
- New function: cj/org-sort-by-todo-and-priority
- Sorts by TODO status (TODO before DONE) AND priority (A→B→C→D)
- Uses stable sorting: priority first, then TODO state
- Gracefully handles empty sections (no error)
- Bound to C-; o o (ordering → org sort)
- Files: modules/org-config.el:278-299, modules/custom-ordering.el:253,267

### 3. Comprehensive ERT test suite (12/12 passing)
- Normal cases: Mixed TODO/DONE, multiple of same type, same priority
- Boundary cases: Empty sections, single entries, no priorities
- Error cases: Non-org-mode buffer
- Test file: tests/test-org-sort-by-todo-and-priority.el

### 4. Testing improvements discovered
- Disable org-mode hooks to avoid package dependencies in batch mode
- org-sort-entries must be called from parent heading
- Preserve priority cookie in org-get-heading (t t nil t)
- Add condition-case to handle "Nothing to sort" gracefully

### 5. Minor cleanup
- Comment out chime-debug setting (org-agenda-config.el:267)
- Mark modeline lag task as DONE in todo.org

## Technical Details

Modeline optimization:
- line-number-at-pos is O(n) where n = current line
- %l and %c are O(1) lookups from cached values

Org sorting algorithm uses stable sort:
1. Sort by priority (A, B, C, D, unprioritized)
2. Sort by TODO status (preserves priority order within groups)
Result: TODO [#A], TODO [#B], DONE [#A], DONE [#B], etc.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>config: Update chime.el to use new alert-intervals format</title>
<updated>2025-11-03T07:09:51+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-03T07:09:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=1b68b42839d3ec4e05401f73e812c4211d3dcc29'/>
<id>urn:sha1:1b68b42839d3ec4e05401f73e812c4211d3dcc29</id>
<content type='text'>
Updated chime configuration for severity refactor:
- Replaced chime-alert-time and chime-alert-severity with
  chime-alert-intervals '((5 . medium) (0 . medium))
- Changed polling interval from 60s to 30s for faster response
- Added chime-day-wide-time "09:00" for all-day event notifications
- Removed settings that match defaults (play-sound, keyword filters, etc.)
- Changed chime-debug from t to nil

All notifications now use medium urgency.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
