<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/tests/test-ai-conversations-browser.el, branch load-graph-classify-end</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-end</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-end'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-05-16T07:00:19+00:00</updated>
<entry>
<title>feat(ai-conversations-browser): dired-style browser for saved GPTel conversations</title>
<updated>2026-05-16T07:00:19+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-16T07:00:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=3f50f682053dd31d5fac96ecdf2b98aad1ce56d7'/>
<id>urn:sha1:3f50f682053dd31d5fac96ecdf2b98aad1ce56d7</id>
<content type='text'>
`cj/gptel-load-conversation` prompts via `completing-read`.  A
dedicated browser shows what each conversation is about at a
glance and supports single-key load / delete / rename without
having to scroll a minibuffer list.

New module `modules/ai-conversations-browser.el` +
`cj/gptel-browse-conversations` entry point bound to `C-; a b`
("browse conversations").  Opens `*GPTel-Conversations*` in
`cj/gptel-browser-mode` (a `special-mode` derivative).

Each row shows date, time, topic slug, and a preview of the most
recent message (length configurable via
`cj/gptel-browser-preview-length`, default 60 chars).  Rows sort
newest first.

In the browser:
- `RET` / `l`: load the conversation (delegates to
  `cj/gptel-load-conversation` with the file pre-selected via a
  `cl-letf` stub on `completing-read` so the user isn't prompted
  twice), then bury the window.
- `d`: delete the file under point after `y-or-n-p` confirmation,
  re-render.
- `r`: rename the file under point.  Preserves the timestamp,
  slugifies the new topic, refuses unchanged input and existing
  targets.
- `g`: refresh.
- `n` / `p`: next / previous row.
- `q`: quit-window.

21 tests cover the helpers (topic parsing, header stripping,
preview shaping for truncate / short / empty cases, row-for-file
with conversation + non-conversation filenames, rows enumeration,
render output for empty + populated cases, newest-first sort,
rename-target preservation of timestamp + slug, rename-target
error on missing timestamp) and the file-touching actions (delete
with y, cancel with n, rename, rename-on-empty-line error).
</content>
</entry>
</feed>
