From c563fbfb688efb2221049b9a3875060172b59277 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 27 Jun 2026 14:03:13 -0400 Subject: chore(todo): file the session's deferred work, close ghostel consolidation Add seven tasks for the deferred changes from the EAT, dirvish, and completion-category work: darken the EAT diff colors, rebuild the theme-studio dirvish preview (under the Theme-Studio project), root-cause webm previews, completion categories for the mu4e attachment picker and the file-basename pickers, and two watchlist items at #D (the Claude Code upstream bleed and the occur/xref font-lock question). Close Consolidate on EAT now that Phase 5 shipped this session. --- todo.org | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/todo.org b/todo.org index 70be27adb..7000547f1 100644 --- a/todo.org +++ b/todo.org @@ -57,7 +57,8 @@ Tags are additive. For example, a small wrong-behavior fix can be * Emacs Open Work ** PROJECT [#A] Manual testing and validation Exercised once the phases above land. -*** VERIFY F12 opens the eshell-through-EAT terminal (dock, visual, colors, prompt, z) +*** DONE F12 opens the eshell-through-EAT terminal (dock, visual, colors, prompt, z) +CLOSED: [2026-06-27 Sat 12:50] What we're verifying: F12 now opens and toggles eshell run through EAT (eat-eshell-mode), docked with the remembered geometry; F12 + C-; reach Emacs from inside it; and the eshell-in-eat features land. Wiring verified live; this is the hands-on check only Craig can run. - Press F12 in a normal frame. Expected: an eshell docks (bottom or right per the column rule), prompt shows the git branch when in a repo, focus in it. - Run a visual command (=htop= / =vim FILE= / =less FILE=). Expected: it renders full-screen in EAT, behaves like a real terminal. @@ -67,14 +68,16 @@ What we're verifying: F12 now opens and toggles eshell run through EAT (eat-eshe - Press F12 again from inside. Expected: hides. Press F12 again. Expected: returns at the remembered size. - From inside, press =C-; b= (a window-family leaf). Expected: the global prefix works, not typed into the shell. Expected: F12 docks/hides/redocks one eshell-through-EAT terminal; visual commands render, colors are clean, the prompt shows branch + exit status, =z= jumps, and F12/C-; reach Emacs. -*** VERIFY ai-term agents run through EAT (launch, swap, detach/reattach) +*** DONE ai-term agents run through EAT (launch, swap, detach/reattach) +CLOSED: [2026-06-27 Sat 12:50] What we're verifying: agents now spawn in EAT instead of ghostel, with the tmux persistence intact. The spike + 157 unit tests pass; this is the live agent launch only Craig can run. - =C-; a a= (or =C-; a s= to pick a project). Expected: an agent launches in an EAT terminal (buffer =agent []=) running the AI tool over tmux. - With two agents open, press =M-SPC= repeatedly. Expected: it swaps to the next agent (M-SPC reaches Emacs from inside the EAT agent buffer). - Kill an agent buffer (not the session), then re-open the same project. Expected: it reattaches the live tmux session (output intact), not a fresh agent. - After an Emacs restart with =aiv-*= sessions alive, re-open a project. Expected: reattaches the detached session. Expected: agents launch and render in EAT, M-SPC swaps from inside, and detach/reattach works exactly as it did on ghostel. -*** VERIFY ai-term next steps into and attaches a detached session +*** DONE ai-term next steps into and attaches a detached session +CLOSED: [2026-06-27 Sat 12:50] What we're verifying: =C-; a n= (or =M-SPC=) cycles into a detached ai-term (alive in tmux, no Emacs buffer) and attaches it, not just live buffers. The pure logic is unit-tested; this is the live attach-on-landing check only Craig can run. - Start agents in two projects so two ai-terms exist, then leave one detached (kill its Emacs buffer while the tmux session stays alive, or after an Emacs restart that leaves =aiv-*= sessions running). - Confirm one is attached (a live =agent [...]= buffer) and one is detached (its =aiv-= tmux session is alive but has no buffer). @@ -426,6 +429,8 @@ What we're verifying: in dirvish, d now duplicates the file at point (delete-to- Expected: d duplicates; D names the exact targets and only deletes on yes; the files are gone with no trash copy. If sudo needs a password that shell-command can't supply, flag it — the delete may need to route through a tty instead. ** PROJECT [#A] Theme-Studio Open Work Parent grouping the open theme-studio / theming issues; close each child independently. +*** TODO [#C] Dirvish preview rebuild :feature: +Rebuild =renderDirvishPreview= (=scripts/theme-studio/previews.js=), today a flat face-catalog, into a believable two-pane dirvish modeled on the real-dirvish screenshot, with fake data: a realistic listing (nerd-icon per type, right-aligned sizes, dir-entry counts, hl-line highlight, dimmed backup, italic dir header) plus a right-hand preview pane (=ls -l= of the selected dir). Keep face coverage by folding vc-state/git-msg/size/time into realistic attribute columns and moving media-info/proc/narrow/emerge to a small labeled extras strip. Option 2 chosen 2026-06-27. *** TODO [#A] theme-studio: consistent assignment-view table columns :feature:studio:next: All view-assignment tables should use one consistent column set and order, whatever view is selected: element name (sortable), lock, fg, bg, style, box (with a side expansion showing the selected color, as in UI faces), contrast, inheritance, size, preview text. No other columns at this design stage. When a view's elements can't take a given section, raise a signal and disable that section for that view; the disabled state is the visual cue. From the roam inbox 2026-06-16. *** VERIFY [#A] theme-studio: deploy-wip button on the browser page :feature:studio:next: @@ -667,14 +672,15 @@ Couldn't reproduce — neither could Craig (2026-06-25). The toggle code is clea ** DONE [#B] F12 pops EAT instead of ghostel :feature:studio: CLOSED: [2026-06-25 Thu] Done 2026-06-25, design doc =docs/design/eat-f12-toggle.org=. Part A (commit fe7aa658): F12 toggles a single EAT terminal instead of ghostel, reusing the dock-and-remember geometry toggle; ghostel stays for ai-term (M-SPC); EAT runs a plain shell with no tmux; F12 and C-; are bound in EAT's keymaps so they reach Emacs from inside the terminal. Part B (commit 687b438f): EAT's faces are exposed in theme-studio (16 named palette + attribute + prompt-annotation faces) with a =renderEatPreview=, no colors set so it stays vanilla. term 223/223, ai-term 158/158, studio gates green; the toggle wiring (F12 reaches Emacs in EAT, =(eat)= creates the buffer, the predicate recognizes it) was verified live in the daemon. Accepted tradeoff: EAT needs a buffer reload to pick up a theme switch (ghostel auto-resyncs), taken for EAT's pure-elisp face control. The visual F12 dock/toggle check is a VERIFY under Manual testing and validation. -** DOING [#B] Consolidate on EAT, retire ghostel :feature:refactor: +** DONE [#B] Consolidate on EAT, retire ghostel :feature:refactor: +CLOSED: [2026-06-27 Sat] Make EAT the only terminal and remove ghostel entirely (decision 2026-06-25). Phased; the ai-term port (Phase 3) wants its own focused session with a spike first. - Phase 1 DONE (commit 82294404): extracted =modules/eat-config.el= (eat package + F12/C-; keymaps + the F12 dock-and-remember toggle) out of =term-config.el=. term-config keeps ghostel (ai-term's backend) and requires eat-config. Toggle tests retargeted to eat-config; full suite green. - Phase 2 DONE (commit 0290b015): EAT experience settings in eat-config.el -- yank-to-terminal on, directory-tracking / prompt-annotations / command-history / mouse / kill-from-terminal / alt-screen affirmed, 10MB scrollback, truecolor already on via the compiled =eat-truecolor= terminfo. zsh shell-integration source line added to =~/.dotfiles/common/.zshrc= (uncommitted -- needs a dotfiles commit + a pull on the other daily driver). - F12 = eshell-through-EAT (2026-06-25, commits cbd38d88 + c99fad28): F12 now opens eshell run through EAT (eat-eshell-mode) instead of a standalone EAT zsh shell, so the primary terminal is eshell (elisp functions as commands, TRAMP transparency) with EAT rendering visual commands. Retired eshell-toggle + xterm-color; added a zsh-parity prompt (git branch + [N] exit status) and a zoxide =z= sharing the zsh database. eat-config + eshell-config kept separate. - Phase 3 DONE (commit 6c8f2a9c): ported ai-term from ghostel to EAT. The spike confirmed EAT + tmux detach/reattach behaves exactly like ghostel + tmux (eat spawns, sends =tmux new-session -A -s aiv-=; killing the buffer leaves the session alive; respawn reattaches). The coupling was far smaller than feared -- most of the ~30 refs were comments, and agent detection is name-based ("agent [...]"), so backend-agnostic. Swaps: =(ghostel)= -> =(eat)= with =eat-buffer-name=, =ghostel-send-string= -> a process-send-string helper, M-SPC bound directly in =eat-semi-char-mode-map= (no exception/rebuild dance). 157 ai-term tests green. Real-agent launch + detach/reattach is a VERIFY under Manual testing and validation. - Phase 4 DONE (commit 6a9ec62e): retired ghostel. Migrated the terminal-generic keepers into eat-config -- the tmux copy-mode (=C-= enters it, same UX + keybinding; agents run EAT over tmux so it's still tmux's own copy-mode) and the tmux-history capture, swapping =ghostel-send-string= -> a pty write and the mode checks -> eat-mode. Repointed the dashboard "Launch Terminal" to =cj/term-toggle=, swapped the =face-diagnostic= terminal-mode check to eat-mode, refreshed the auto-dim comment. Deleted =term-config.el= + its init require. EAT's default =eat-semi-char-non-bound-keys= already lets windmove / buffer-move / Emacs keys reach the terminal, so no exception-list port was needed. Tests retargeted (tmux-history 15/15). The copy-mode + tmux-history live check is a VERIFY under Manual testing and validation. -- Phase 5 (remaining cleanup): remove the theme-studio ghostel app (=GHOSTEL_FACES=) now those faces are dead (ansi-color stays -- EAT inherits it); =package-delete= the unused ghostel ELPA package; sweep the few remaining ghostel mentions in comments/docs. Optional: surface F8/F10 in =eat-semi-char-non-bound-keys= if Craig misses them in agent buffers (needs the rebuild check). +- Phase 5 DONE (commit eb4aa232): removed the theme-studio ghostel app (=GHOSTEL_FACES=) now those faces are dead (ansi-color stays -- EAT inherits it), =package-delete='d the ghostel ELPA package, and swept the remaining ghostel mentions in comments/docs. The optional F8/F10 surfacing in agent buffers was not pursued. ** TODO [#C] ai-term.el commentary names a stale F9 keybinding scheme :quick:solo: The header commentary (lines ~43-64) still documents an old =F9= / =C-F9= / =s-F9= / =M-F9= scheme for =cj/ai-term= and its family, but those bindings no longer exist — F9 is unbound in the daemon and the only live global binding is =M-SPC= -> =cj/ai-term-next= (=ai-term.el:1059=). The =M-= mention in the =cj/ai-term-shutdown= docstring (~996) is stale too. Rewrite the commentary and any stale docstrings to match the current keymap. Found 2026-06-25 while scoping the F12 -> EAT work. @@ -4137,6 +4143,25 @@ Three small reveal.js improvements; collected into one task because each on its ** TODO [#D] Treesitter grammar offline cache :feature: Treesitter grammars are downloaded by =treesit-auto= on first use and live outside the localrepo. For true offline reproducibility, cache the grammars next to the localrepo (a =.localrepo/treesitter/= tier, or a separate mirror script). Cross-linked from =docs/design/localrepo.org=. + +** TODO [#C] EAT diff green and red too bright :quick: +The added and removed line backgrounds in Claude Code diffs read too bright. Sample a live colored diff in an agent buffer to read the exact =eat-term-color= indices (the added green is =eat-term-color-22= / =#005F00=, confirmed via =C-h F=; also the removed red and the brighter word-highlight shades), then add darker =eat-term-color-N= overrides to =WIP-theme.el= so green and red darken together. Caveat: a 256-cube color override is global, hitting every terminal program that emits it. Needs Craig's call on the target darkness. + +** TODO [#C] Webm previews not rendering in dirvish :bug:solo: +Dirvish computes a valid MD5-hashed cache path and =ffmpegthumbnailer= thumbnails the webm fine by hand, but dirvish's async cache generation never lands the jpg, so no preview shows. Root-cause the async step: trace the =(cache . CMD)= recipe dispatch and sentinel (=dirvish-shell-preview-proc-s=, =dirvish--make-proc=) to find why the generated jpg is never written or displayed. + +** TODO [#C] Completion category for the mu4e attachment picker :feature:solo: +The Save-attachment picker (=mu4e-attachments.el=) has bare candidates worth a category. Add a custom category plus a table annotation-function showing each attachment's MIME type and size; confirm the mu4e part-plist keys first. Helper =cj/completion-table-annotated= is in =system-lib=. + +** TODO [#C] Completion categories for the file-basename pickers :feature: +Eight =completing-read= pickers list bare file basenames, so marginalia can't annotate them: chrono-tools sounds, org-drill flashcards, help-config Info files, test-runner tests, music-config files, vc-config clone dirs, plus hugo drafts and org-agenda projects. For each, either make the candidates absolute paths so the standard =file= category resolves them, or tag a custom category with a small annotator. Decide per site. Helper =cj/completion-table= is in =system-lib=. + +** TODO [#D] Claude Code unterminated-color bleed (upstream) +Claude Code truncates a colored span without a reset, so the color bleeds down the EAT buffer. The newline-reset workaround (=cj/eat-reset-sgr-at-newline=) contains the streaming case but not cursor-positioned / full-screen rendering, and a full EAT-side fix would break legitimate cross-line color. The clean fix is upstream -- report it to Claude Code with a minimal repro. + +** TODO [#D] occur/xref font-lock coloring watch :bug: +=occur= and =xref= enable font-lock themselves, not via =global-font-lock-mode=, so the exclusion fix does not apply and they show source-line fontification on purpose. No action unless a result ever renders with colors that do not match its source buffer, in which case investigate the real mechanism. + * Emacs Someday/Maybe ** TODO [#D] GPTel orphan tasks and useful ideas :feature: -- cgit v1.2.3