<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/modules, branch v0.7.2</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=v0.7.2</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=v0.7.2'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-04-03T13:33:33+00:00</updated>
<entry>
<title>feat(music): add random-aware next/previous; refactor music + calendar-sync</title>
<updated>2026-04-03T13:33:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-03T13:33:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=bd9875accc3b4b51b7d5424b0a20dde35c338a0f'/>
<id>urn:sha1:bd9875accc3b4b51b7d5424b0a20dde35c338a0f</id>
<content type='text'>
Music: random mode now respected by next/previous keys. Previous navigates
a 50-track play history ring buffer. Fixed playlist replacement bug.
24 new tests.

Calendar-sync: consolidated duplicate parse functions, extracted timezone
localization helper, unified expand-daily/monthly/yearly into parameterized
function, removed dead code. 33 new characterization tests. -90 lines.
</content>
</entry>
<entry>
<title>feat(org): add &lt;cj structure template for daily prep comment blocks</title>
<updated>2026-04-02T16:41:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-02T16:41:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=34b3e8b802b782c29375d51528dbbe22c5b317d8'/>
<id>urn:sha1:34b3e8b802b782c29375d51528dbbe22c5b317d8</id>
<content type='text'>
Add org-tempo template expanding &lt;cj TAB to #+begin_src cj: comment blocks.
</content>
</entry>
<entry>
<title>feat(music): add test coverage for 7 functions, refactor with extracted helpers</title>
<updated>2026-04-01T13:13:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-01T13:13:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=c0779b05af9c3b6f2e5bd4383e0116806f5a4a12'/>
<id>urn:sha1:c0779b05af9c3b6f2e5bd4383e0116806f5a4a12</id>
<content type='text'>
Add 47 new unit tests across 7 test files covering playlist-modified-p,
assert-valid-playlist-file, playlist-tracks, create-radio-station,
ensure-playlist-buffer, after-playlist-clear, and header-text.

Extract three helpers to reduce duplication: assert-m3u-files-exist (dedupes
2 identical guards), sync-playlist-file (dedupes 3 state-sync patterns),
and select-m3u-file (reusable M3U selection with cancel). Simplify
append-track-to-playlist nesting from 6 to 4 levels. Delete unused
cj/music-keymap-prefix variable.
</content>
</entry>
<entry>
<title>fix(slack): disable emojify in lui buffers, add org cache reset command</title>
<updated>2026-03-16T17:27:42+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-16T17:27:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=2c1e016f9ca8b2df52f78480033e4fa7713afd29'/>
<id>urn:sha1:2c1e016f9ca8b2df52f78480033e4fa7713afd29</id>
<content type='text'>
Disable slack-buffer-emojify to prevent wrong-type-argument listp errors
on emoji characters during lui-scroll-post-command recenter. Add C-; O c
to reset org-element cache across all org-mode buffers.
</content>
</entry>
<entry>
<title>fix(slack): add error visibility to notification handler</title>
<updated>2026-03-14T17:55:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-14T17:55:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=5ca91aec8117a26d9ec9e65bace21764996a2136'/>
<id>urn:sha1:5ca91aec8117a26d9ec9e65bace21764996a2136</id>
<content type='text'>
Websocket library silently swallows callback errors via condition-case.
Wrap cj/slack-notify in condition-case to surface errors in *Messages*.
Add cj/slack-test-notify command for pipeline verification.
</content>
</entry>
<entry>
<title>fix(slack): fix notification bug, add close-all-buffers command</title>
<updated>2026-03-10T13:03:13+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-10T13:03:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=666bf2a07290d7428423d36f8c55317b140e4e09'/>
<id>urn:sha1:666bf2a07290d7428423d36f8c55317b140e4e09</id>
<content type='text'>
Pass missing team arg to slack-message-mentioned-p (was breaking all
channel notifications). Add cj/slack-close-all-buffers on C-; S Q.
</content>
</entry>
<entry>
<title>fix(music): place point on first track after playlist load/reload</title>
<updated>2026-03-10T12:24:25+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-10T12:24:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=78551610d438ffc31c836550f17010137ec11d0e'/>
<id>urn:sha1:78551610d438ffc31c836550f17010137ec11d0e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(calendar-sync): handle variable-length date lists in RRULE UNTIL</title>
<updated>2026-03-10T04:40:26+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-10T04:40:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=818cf167159668efc736930549d3001081c2383f'/>
<id>urn:sha1:818cf167159668efc736930549d3001081c2383f</id>
<content type='text'>
date-to-time used (reverse date) which broke when RRULE UNTIL values
were parsed as 5-element lists (year month day hour minute) from UTC
timestamps. This caused recurring events with UTC UNTIL dates to
expand to 0 occurrences, producing stale calendar entries.
</content>
</entry>
<entry>
<title>refactor(gptel): extract model-list and selection logic for testability</title>
<updated>2026-03-07T03:20:29+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-07T03:20:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=e72d0d49a442b843a3fc721f070f6a7713d1f87d'/>
<id>urn:sha1:e72d0d49a442b843a3fc721f070f6a7713d1f87d</id>
<content type='text'>
- Extract cj/gptel--build-model-list from cj/gptel-change-model
- Extract cj/gptel--current-model-selection from cj/gptel-change-model
- Add test-ai-config-build-model-list.el (9 tests)
- Add test-ai-config-current-model-selection.el (8 tests)
</content>
</entry>
<entry>
<title>refactor(gptel): lazy-load gptel-magit, rebind rewrite/context keys</title>
<updated>2026-03-07T03:15:31+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-07T03:15:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=4b14c95ead89709702c617a85929424be980cc6b'/>
<id>urn:sha1:4b14c95ead89709702c617a85929424be980cc6b</id>
<content type='text'>
- Replace use-package gptel-magit hook with autoloads via
  with-eval-after-load 'magit (loads gptel only on key press)
- Move org header defuns above use-package to fix load order
- Set gptel-include-reasoning to "*AI-Reasoning*" buffer
- Rebind rewrite to C-; a r, clear context to C-; a c
- Add test-ai-config-gptel-magit-lazy-loading.el (8 tests)
- Mark all ai-config cleanup items DONE in todo.org
</content>
</entry>
</feed>
