aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--todo.org63
1 files changed, 53 insertions, 10 deletions
diff --git a/todo.org b/todo.org
index 88f7f3df2..efbfa3d03 100644
--- a/todo.org
+++ b/todo.org
@@ -55,18 +55,60 @@ Tags are additive. For example, a small wrong-behavior fix can be
=:bug:quick:=, and a feature that requires internal restructuring can be
=:feature:refactor:=.
* Emacs Open Work
-** TODO [#C] EAT: ctrl+backspace deletes the previous word :feature:
-Enable Ctrl+Backspace inside EAT terminals to delete the previous word, matching its behavior in other buffers. From the roam inbox.
-** TODO [#C] Delay GPG/SSH key prompt until first use :refactor:
-Emacs prompts for the GPG/SSH passphrase soon after startup. Defer the key unlock until the functionality that actually needs it is first used. From the roam inbox.
-** TODO [#C] Register F1 in EAT so dashboard F1 works in ai-term :bug:quick:solo:
-F1 (the dashboard help key) does not reach Emacs inside ai-term/EAT buffers; the terminal swallows it. Add F1 to the EAT keymap exceptions and rebuild, following the F9/F12 pattern in ai-term.el. From the roam inbox.
-** TODO [#C] Replace all-the-icons with nerd-icons everywhere :refactor:
-Audit every remaining all-the-icons usage, map each to its nerd-icons equivalent, and migrate, to drop the all-the-icons package. From the roam inbox.
+** DONE [#C] EAT: ctrl+backspace deletes the previous word :feature:
+CLOSED: [2026-06-29 Mon]
+Bound =C-<backspace>= in =eat-semi-char-mode-map= to =cj/term-backward-kill-word=, which sends M-DEL (ESC DEL) to the pty — readline's backward-kill-word, the same word-boundary delete C-<backspace> does in normal buffers. Terminals send no standard code for Ctrl+Backspace, so EAT's default forwarded a bare key the program dropped. Live-reloaded; M-DEL byte sequence (27 127) confirmed. Hands-on check (does the claude TUI honor it?) filed under "Manual testing and validation". From the roam inbox.
+** DONE [#C] Delay GPG/SSH key prompt until first use :refactor:
+CLOSED: [2026-06-29 Mon]
+Root cause: calendar-sync ran calendar-sync-start at module load, syncing immediately and then on a timer. Every configured calendar (google, proton, deepsat) resolves its .ics feed URL from a :secret-host in authinfo.gpg, so both the immediate sync and each timer tick decrypt authinfo.gpg — surfacing as a GPG passphrase prompt right after startup on a cold gpg-agent. No ssh-agent config exists, so the "SSH" part was really this GPG prompt. Fix: deferred the whole calendar-sync-start (immediate sync + recurring timer) to the first org-agenda use via a one-shot org-agenda-mode-hook (calendar-sync.el). Manual calendar-sync-start/-now still work on demand. 2 new ERT tests for the one-shot helper; full suite green; live-reloaded. Cold-reboot confirm filed under "Manual testing and validation". From the roam inbox.
+** DONE [#C] Register F1 in EAT so dashboard F1 works in ai-term :bug:quick:solo:
+CLOSED: [2026-06-29 Mon]
+F1 (the dashboard help key) did not reach Emacs inside ai-term/EAT buffers; the terminal swallowed it. Bound =<f1>= to =cj/dashboard-only= in =eat-semi-char-mode-map= and =eat-mode-map= (eat-config.el), alongside the existing F12 and C-; passthroughs. EAT needs no exception-list/rebuild dance (that was ghostel) — the bind alone suffices. Live-reloaded into the daemon; hands-on UX check filed under "Manual testing and validation".
+** DONE [#C] Replace all-the-icons with nerd-icons everywhere :refactor:
+CLOSED: [2026-06-29 Mon]
+nerd-icons already rendered every icon (dashboard, dirvish, ibuffer, completion). all-the-icons survived only as scaffolding: a font-install helper, the all-the-icons-nerd-fonts bridge, and a terminal-blanking advice block the nerd-icons sibling already duplicated. Removed all of it (font-config.el, keyboard-compat.el) and repointed the font-install helper at nerd-icons ("Symbols Nerd Font Mono"), keeping the auto-install-on-first-GUI-frame convenience. Renamed cj/maybe-install-all-the-icons-fonts → cj/maybe-install-nerd-icons-fonts and updated its two tests. Full suite green, live-reloaded. Visual confirm filed under "Manual testing and validation". From the roam inbox.
** TODO [#C] Music: create playlists from a radio.info lookup :feature:
Create EMMS playlists from a radio.info (radio-browser) station lookup. From the roam inbox.
** PROJECT [#A] Manual testing and validation
Exercised once the phases above land.
+*** VERIFY nov reading view: palettes, font sizing, width keys
+What we're verifying: the nov-reading layer renders correctly in a real EPUB — palette colors, live font sizing, and the moved width keys. Faces + pure logic are unit-tested and the layer applies live in a temp buffer; this is the on-screen reading check only Craig can eyeball.
+- Open an EPUB (=M-x calibredb=, or open a .epub file).
+Expected: it opens in the sepia palette (warm dark background, tan text) at a comfortable serif size.
+- Press =c= a few times.
+Expected: cycles sepia -> dark -> light -> none (theme default) -> back. =C= prompts to pick one by name.
+- Press =+= and =-=.
+Expected: the page font grows/shrinks live. == returns it to the default size.
+- Press =+= twice, then close the book (=q=) and reopen it (same or a different EPUB). Then restart Emacs and open an EPUB.
+Expected: the book reopens at the bumped-up size, not the base — the live size is remembered globally across books and across sessions (persisted to =data/nov-reading-text-scale=). Pressing == resets to base and that reset also persists.
+- Press ={= and =}=.
+Expected: the text column narrows/widens (the width control, moved off +/-).
+- In an EPUB that has chapter headings and internal links (a TOC page works), eyeball a heading and a link under each palette (cycle with =c=).
+Expected: headings and links carry the palette's accent color — for sepia a warm gold heading and amber link, for dark a near-white heading and soft-blue link, for light a dark-brown heading and warm-brown link. Headings keep their relative sizing; links stay underlined. Crucially, opening HTML mail or eww shows the normal theme shr colors, NOT these reading accents (the remap is buffer-local to nov).
+- Open theme-studio (=make -C scripts/theme-studio open=), find the "nov reading view" app.
+Expected: the face list now has nine faces — the three palettes plus a -heading and -link for each. The preview shows three mock book pages (Hawthorne's "Dr. Heidegger's Experiment") in sepia / dark / light; each page's title is drawn in that palette's heading face and an inline phrase ("the rose of half a century") in its link face. Tuning a palette, heading, or link face repaints its page and writes into the dupre theme.
+*** VERIFY No GPG prompt at startup; calendar syncs on first agenda use
+What we're verifying: calendar-sync no longer decrypts authinfo.gpg at startup, so a cold gpg-agent isn't prompted until calendar data is first wanted. The deferral is unit-tested; this is the cold-agent reboot behavior only Craig can confirm. Needs a cold gpg-agent to be meaningful (clear it or reboot).
+- Clear the agent cache: run =gpgconf --kill gpg-agent= in a shell (or reboot).
+- Start Emacs fresh and use it normally for a bit WITHOUT opening the agenda.
+Expected: no GPG passphrase prompt appears on its own.
+- Now open the agenda (F8, or =M-x org-agenda=).
+Expected: the GPG prompt appears now (once), calendar-sync starts, and the agenda fills in with calendar events on the next refresh. Subsequent agenda opens don't re-prompt (agent caches).
+*** VERIFY Icons still render after dropping all-the-icons
+What we're verifying: removing the all-the-icons package left every icon intact, since nerd-icons was already doing the rendering. Verified by the full test suite and a live-reload; this is the eyeball-on-a-clean-restart confirm. Best done after a real Emacs restart (not just the daemon live-reload), which is the true test that nothing depended on all-the-icons being loaded.
+- Restart Emacs (or the daemon).
+- Open the dashboard (F1), a dirvish buffer, =M-x ibuffer=, and any =completing-read= picker (e.g. =C-x b=).
+Expected: file/dir/mode icons render everywhere they did before (dashboard navigator glyphs, dirvish file icons, ibuffer rows, completion candidates). No missing-glyph boxes, no errors about all-the-icons functions.
+*** VERIFY C-<backspace> deletes the previous word in an ai-term/EAT terminal
+What we're verifying: =C-<backspace>= now deletes the previous word inside an EAT terminal (the claude agent TUI, and bash once the agent exits), matching its behavior in normal buffers. It sends M-DEL to the pty; verified live that the binding sends ESC DEL (27 127). Whether the running program honors M-DEL is the program-specific bit only Craig can confirm in the terminal.
+- =C-; a a= (or =C-; a s=) to open an agent in an EAT buffer; click into the terminal.
+- Type a few words (e.g. =foo.bar baz=) at the agent prompt, then press =C-<backspace>=.
+Expected: the previous word is deleted with word boundaries (e.g. =bar= goes, leaving =foo.= ), not the whole line. If the claude TUI ignores M-DEL (nothing deletes), tell me and I'll switch the binding to send C-w (whitespace-delimited, more widely honored).
+*** VERIFY F1 reaches Emacs inside an ai-term/EAT agent buffer
+What we're verifying: =<f1>= now runs =cj/dashboard-only= (the kill-all sweep back to the dashboard) from inside an EAT agent terminal, instead of being swallowed by the pty. Bound in =eat-semi-char-mode-map= + =eat-mode-map=; verified live with =keymap-lookup=, this is the in-terminal keypress only Craig can confirm.
+- =C-; a a= (or =C-; a s=) to open an agent in an EAT buffer; click into the terminal so EAT has focus.
+- Press =F1=.
+Expected: the dashboard is shown (other windows cleared, agent buffer buried not killed — its tmux session survives and =C-; a a= brings it back). F1 does not type into the agent.
*** TODO File-basename pickers show marginalia size/date annotations
What we're verifying: the eight pickers now carry a completion category and annotator (commit 4d644374), so marginalia should show a size + date suffix beside each candidate (a "dir" marker for directory candidates). The metadata is unit-tested; this is the live minibuffer render only Craig can see. Marginalia must be on (it is in this config). Eyeball each prompt, then =C-g=.
- =M-x cj/tmr-select-sound-file=. Expected: each timer-sound candidate shows a size + YYYY-MM-DD suffix.
@@ -729,11 +771,12 @@ Brainstorm complete 2026-06-22 — validated design at [[file:docs/design/vamp-m
Next: (1) revise the spec to the new direction; (2) spike the risky assumptions (mpd dumb-single-file-player contract; m3u =.desktop= on Hyprland); (3) =/start-work= against the revised spec — pure-helper extraction (review Migration Plan step 1) is the safe first phase.
-** TODO [#C] nov: sepia reading view (dark bg, tan/sepia text) :feature:
+** DONE [#C] nov: sepia reading view (dark bg, tan/sepia text) :feature:
+CLOSED: [2026-06-29 Mon]
:PROPERTIES:
:LAST_REVIEWED: 2026-06-29
:END:
-A sepia setting for =nov-mode=: keep a dark background, render the letters in a tan/sepia color. nov defines no faces of its own and leans on shr, so the path is buffer-local face-remapping (=face-remap-add-relative= on =default= / =shr-text= / =variable-pitch=) in a nov-mode hook, toggled per a sepia preference. Overlaps the "epub/nov reading color" note under "Route hardcoded theme colors through the theme" (the removed =#E8DCC0= sepia plus "needs a themeable reading face") — reconcile with that themeable-face direction. From the roam inbox.
+Grew into a reading-view theme layer, =modules/nov-reading.el=, on top of stock nov (no fork). Buffer-local: a reading palette (sepia/dark/light, each a themeable face the dupre theme owns, sepia default; =c= cycles, =C= selects), serif typography (family + a defcustom base height replacing the old hardcoded 180), and page font sizing (=+=/=-= live, == resets); width moved to ={= =}=. Pulled the reading concerns out of calibredb-epub-config.el (keeps library + width/centering). Dropped the frame-global EBook fontaine preset (reading size is buffer-local now). Registered the 3 palette faces as a "nov reading view" app in theme-studio (face_data.py + regenerated). Reconciled the "epub/nov reading color" / themeable-face note: done via theme-owned faces, not a hardcoded hex. Full suite + theme-studio check green. Committed 659197c7. Live reading-view confirm filed under "Manual testing and validation". From the roam inbox.
** TODO [#C] pdf-view: epdfinfo crashes loading some PDFs (large IA scans) :bug:
:PROPERTIES:
:LAST_REVIEWED: 2026-06-29