aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* chore(todo): file dirvish single-instance/buffer-hygiene task (inbox zero)Craig Jennings8 hours1-0/+2
|
* chore(todo): close eww UA injection bug (lexical special-var trap, real ↵Craig Jennings9 hours1-2/+3
| | | | production fix)
* fix(eww): inject the User-Agent reliably under byte-compilationCraig Jennings9 hours1-0/+7
| | | | eww-config.el is lexical-binding and the User-Agent advice let-binds url.el's url-request-extra-headers, but the file never declared it special. The byte-compiler then bound it lexically, so the injected header never reached url-retrieve and the desktop User-Agent silently dropped in compiled production (eww kept working, just with the default UA). A top-level (defvar url-request-extra-headers) makes the compiler treat it as dynamic so the binding propagates. The advice tests, which exercise the compiled path, now pass.
* chore(todo): close collapse-split isolation bug (root-caused and fixed)Craig Jennings9 hours1-2/+3
|
* test(ai-term): isolate layout-capture globals in collapse-split testsCraig Jennings9 hours1-2/+12
| | | | The multi-window and single-window collapse tests call cj/ai-term, which captures the current layout into cj/--ai-term-last-direction / cj/--ai-term-last-size on toggle-off, but only let-bound cj/--ai-term-last-was-bury. They leaked last-direction into the display-rule test, whose display-saved action reads those globals to choose the split direction, so its agent buffer split below instead of right and the assertion failed. Let-bind last-direction and last-size to nil, matching the roundtrip test in the same file. Full ai-term suite is green.
* chore(todo): close ai-term detached-step task, file live VERIFY + ↵Craig Jennings9 hours1-2/+11
| | | | collapse-split isolation task
* feat(ai-term): step into detached sessions too, attaching themCraig Jennings9 hours5-112/+166
| | | | The next-agent step (C-; a n / M-SPC) cycled only live agent buffers, so a detached session (alive in tmux, no Emacs buffer) was reachable only through the picker. Now the queue is every active agent, live buffer or live session, keyed on the project dir and ordered by buffer name. Stepping onto a detached one attaches it: show-or-create recreates the terminal, which reattaches the tmux session. The live-buffer swap path is unchanged. I replaced the buffer-rotation helper with a dir-based one and added an active-agent enumerator, with 10 tests.
* chore(todo): park clear-palette (no target) and Slack (defer to Messenger ↵Craig Jennings9 hours1-5/+5
| | | | unification)
* chore(todo): close LSP smoke-test task (done)Craig Jennings16 hours1-7/+2
|
* test(lsp): narrow startup smoke test for prog-lsp config resolutionCraig Jennings16 hours1-0/+66
| | | | Pins the load-time invariants of the central LSP module: lsp-enable-remote stays nil (no auto-start on TRAMP files), the file-watch-ignore defaults live in one idempotent helper, the eldoc provider is stripped from the global hook, and no mode accrues a duplicate lsp-deferred entry. Tests the top-level :init and helper surface, since :config defaults defer to lsp-mode's own load under make test.
* fix(theme-studio): restrict the cursor UI row to fg + bgCraig Jennings16 hours3-12/+56
| | | | Emacs draws the cursor as a rectangle: its foreground colors the glyph sitting on it and its background is the cursor color, but weight/slant/underline/strike and box are no-ops on it. The UI table now shows only the fg and bg swatches for the cursor row and mutes the style and box cells to a dash, so the studio stops presenting controls Emacs drops. New #cursorrowtest gate; styletest/boxtest retargeted off cursor (it was UI_FACES[0], their generic subject) onto the first styled face.
* feat: add avy (in-buffer jump) and wgrep (editable grep)Craig Jennings17 hours2-0/+20
| | | | The two clear wins from the package-list review. avy fills the in-buffer motion gap (C-: jump-to-char-timer, M-g w/l for word/line) that windmove and isearch leave open; wgrep turns a consult-grep / embark-export result into an editable, write-back-across-files refactor (C-c C-p to edit, C-c C-c to apply).
* chore(todo): file F12-EAT task, close terminal-themeability comparison ↵Craig Jennings17 hours1-2/+5
| | | | (researched)
* chore(todo): file eww User-Agent advice test failure (pre-existing, Emacs 30 ↵Craig Jennings17 hours1-0/+2
| | | | derived-mode-p)
* chore(google-keep): mark v1 implemented, file live-setup VERIFY, record in specCraig Jennings17 hours2-4/+27
|
* feat(google-keep): org-page renderer, refresh command, keybindings (Phase 2-3)Craig Jennings17 hours4-0/+359
| | | | The elisp side of the Keep integration: a pure JSON-to-org core (parse, tag/heading/render helpers) kept free of .emacs.d specifics for later extraction, plus the IO runner cj/keep-refresh (async make-process + sentinel, atomic temp-then-rename write to keep-file, stderr-token to display-warning) and the glue (C-c k prefix, executable warning, require in init.el). 15 ERT tests over the core and the parse-render-write chain. Read-only v1; live fetch needs the one-time gkeepapi + token setup.
* feat(google-keep): gkeepapi data bridge with JSON contract (Phase 1)Craig Jennings17 hours2-0/+244
|
* docs(spec): round 2 review clean, google-keep spec ReadyCraig Jennings17 hours1-1/+5
|
* docs(spec): fold round-1 review into google-keep spec (rubric Ready)Craig Jennings17 hours1-30/+90
|
* docs(spec): resolve google-keep decisions (read-only v1 to write v2, ↵Craig Jennings17 hours2-53/+52
| | | | gkeepapi, authinfo)
* chore(todo): close calendar-sync fix, cancel dirvish-previews taskCraig Jennings18 hours1-4/+6
|
* fix(calendar-sync): re-derive status from a declined occurrence overrideCraig Jennings18 hours2-1/+46
| | | | A recurring event declined for one occurrence still synced with :STATUS: accepted, because apply-single-exception merged the override attendees but never re-derived the user's status from them, so filter-declined never dropped it. Re-derive :status via find-user-status when the exception overrides :attendees, leaving the inherited status when the override doesn't name the user. Four new tests cover declined, accepted, no-attendee, and user-absent overrides.
* chore(todo): file calendar-sync declined-occurrence bug (from chime handoff)Craig Jennings19 hours1-0/+2
|
* fix(dirvish): point the bg wallpaper command at set-wallpaper on WaylandCraig Jennings19 hours2-6/+7
| | | | The Wayland branch of cj/--wallpaper-program-for returned swww, but this system's wallpaper daemon is awww, so dirvish "bg" silently no-opped. Point it at the set-wallpaper script (on PATH via dotfiles), which wraps awww img and persists the choice to waypaper's config. X11 still uses feh. Updated the wallpaper-program test to match.
* docs(spec): google-keep in-editor integration spec (draft, 5 open decisions)Craig Jennings19 hours2-1/+155
|
* chore(todo): close converter/face-list/tier-2 items, reframe google-keep as ↵Craig Jennings19 hours1-8/+8
| | | | build-it-here
* feat(ledger): un-orphan ledger-config and rewrite clean-on-saveCraig Jennings19 hours2-14/+27
| | | | ledger-config.el was never required in init.el, so the whole module was dead code. I added the require (which installs ledger-mode, flycheck-ledger, and company-ledger via the global ensure) and rewrote the clean-on-save: instead of rebinding C-x C-s to a clean-then-save command, a buffer-local before-save-hook tidies the buffer on every save path, gated by cj/ledger-clean-on-save. The reports shell out to the ledger CLI, so a load-time check now warns when it isn't on PATH. Added ledger-highlight-xact-under-point.
* chore(todo): inbox-zero — file 5 emacs roam items as tasksCraig Jennings22 hours1-0/+10
|
* chore(todo): log controls.js extraction (tier 2)Craig Jennings23 hours1-1/+3
|
* refactor(theme-studio): extract control factories to controls.js, drop dead ↵Craig Jennings23 hours6-234/+221
| | | | | | | | previewFaceAttrs I split the custom dropdown, detail-editor, and expander factories out of app.js into controls.js (205 lines), spliced back at a CONTROLS_J token by generate.py. The token sits at the exact extraction point, so the assembled page is byte-identical and every gate passes unchanged. app.js drops from 927 to 721 lines. I also removed previewFaceAttrs (function, export, and test). It was test-only dead code whose docstring stalely claimed the gate calls it. The gate uses assertPreviewFaces instead.
* chore(todo): log theme-studio tier-1 simplification completionCraig Jennings24 hours1-0/+4
|
* refactor(theme-studio): tier-1 simplification passCraig Jennings24 hours8-82/+81
| | | | | | | | These are behavior-preserving cleanups from the refactor/simplify assessment, all test-verified. I merged syncMockHeight and syncPkgHeight into one syncPaneHeight(tableId, paneId), inlined the two single-use displayHex/displayName closures, dropped a pkgbody guard that buildPkgTable already does, and had paintUI call worstCellHtml instead of rebuilding the covered-contrast cell. I deleted the dead generatorHues "manual" branch (a copy of the fallback) and locateInfoLine (orphaned when I removed the preview info line earlier today). The two nerd-icons loaders now share _load_nerd_icons_artifact, with a sentinel so a null-file edge keeps its exact behavior. face_coverage.classify reads through named locals now, guarded by a new characterization test. Two assessment findings were wrong and skipped after I checked them against the code: LOCATE_REG is live (read by previewSpan), and normalizePaletteEntryCore doesn't exist.
* fix(theme-studio): gold nav arrows for the language and preview dropdownsCraig Jennings24 hours2-4/+10
| | | | The gold viewnav style was scoped to .pkgbar, so the arrows on the .langbar selectors (language and preview) fell back to default gray. I broadened the rule to .langbar and added a dimmed-gold disabled state for the single-pane preview.
* style(theme-studio): unify nav dropdowns to gold-on-darkCraig Jennings24 hours3-6/+12
| | | | The view, language, and preview selects share a navsel class matching their flanking arrow buttons (dark bg, gold bold-mono text), so each select and its arrows read as one control.
* feat(theme-studio): visible size-nav buttons + 48 pt gallery scaleCraig Jennings25 hours5-53/+83
| | | | | | | | | | The preview dropdown gets flanking nav buttons, matching the view selector, so the size steps with a click. Left/Right arrows do the same when the dropdown is focused. Both clamp at the ends and disable on a single-pane app. I extended the size scale to 32 and 48 pt for inspecting a glyph's detail. The cell width scales with the size, so beyond about 48 pt the grid is mostly scrolling. I removed the separate hover info line beside the dropdown. Each glyph's own title tooltip already shows its face and color, so the line was redundant. A new computed-style gate confirms the point size renders to the right pixels (24 pt is 32 px), so the pt label isn't lying.
* chore(todo): reorganize the Emacs task listCraig Jennings26 hours1-847/+884
|
* chore: refresh synced agent rules and hooksCraig Jennings26 hours8-9/+116
|
* chore(theme-studio): update WIP theme snapshotCraig Jennings26 hours2-107/+141
|
* feat(theme-studio): nerd-icons gallery as a hue-ordered icon gridCraig Jennings26 hours13-187/+2366
| | | | | | | | | | The nerd-icons pane is now a grid: one row per color face, the rows ordered by hue so families cluster, distinct icons (deduped within a color) drawn in their color with the icon's nerd-font name beneath. A "preview:" dropdown above the grid picks the glyph size in points, with Left/Right arrows to step it. Single-pane apps show it disabled, naming the preview. This replaces the v1 legend in the pane, whose data is still captured for round-trip. build-nerd-icons-legend.el is now a library. A cj/nerd-icons-write-legend entry point requires nerd-icons only at write time, so the capture logic loads and unit-tests without it. It dedupes icons by name within a face, computes each face's native hue, and orders the groups by hue. Writing the test surfaced a latent bug: face-hsl used (cadr (assoc t spec)), which grabs the first keyword instead of the plist. It only worked because the real faces fall through to the face-foreground branch. I fixed it to a correct t-clause parse. Coverage: 7 ERT capture tests (dedupe, hue order, lightness tiebreak, name sort, skip rules), 4 Python validator edges, and browser gates for the grid and the size dropdown. Locate stays color-level: clicking a color flashes its icons, and clicking an icon flashes its color row. Icons aren't individually editable, so there's nothing per-icon to select.
* fix(theme-studio): render nerd-icon glyphs in previews instead of tofuCraig Jennings28 hours7-12/+151
| | | | | | | | The legend, dashboard, and package previews drew nerd-icon glyphs as empty boxes. The font-family never reached them: PREVIEW_FONT was spliced into inline style="..." attributes with a double-quoted family name, so the inner quote closed the attribute early and the font was silently dropped. Dropping the quotes fixes it. A no-space family name needs none. I embedded the glyph font directly: Symbols Nerd Font Mono, encoded with fontTools (woff2_compress output is rejected by headed Chrome and Firefox), inlined as a data: URI under the unique family name ThemeStudioNerd so it resolves to the embed rather than a system-installed copy of the same name. The page is self-contained and renders on any clone. I added a #fonttest gate that parses previewLines output and asserts the resolved font-family plus glyph coverage, plus a make font target that re-encodes the woff2 with fontTools.
* chore(todo): wrap-up cleanup — archive resolved tasks, sync child prioritiesCraig Jennings32 hours1-199/+189
| | | | | | Move completed level-2 tasks (latexmk, theme-studio preview-split, tramp dates) into Resolved, and bump two AI-Open-Work child cookies to match their parent. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* chore(elisp): clear byte-compile warnings (18 more modules)Craig Jennings32 hours18-23/+102
| | | | | | Add declare-function/defvar declarations for lazily-loaded package symbols, reflow over-long docstrings, swap pdf-view-*-command interactive-only calls for their non-interactive twins, fix a malformed with-demoted-errors in ledger-config (the clean-buffer body was being read as the format string), and rename the unprefixed global wwwdir to cj/httpd-wwwdir (no external refs). No behavior change. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* chore(elisp): clear byte-compile warnings (calibredb, config-utilities, ↵Craig Jennings32 hours6-2/+53
| | | | | | | | tramp, diff, chrono, auth) Add declare-function/defvar declarations for lazily-loaded package functions and variables so each module compiles cleanly standalone; config-utilities wraps two lazy EmacSQL oref slot reads in with-no-warnings. No behavior change. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* chore(elisp): clear byte-compile warnings (org, music, org-roam)Craig Jennings32 hours4-152/+283
| | | | | | Move own-command bindings out of use-package :bind to keymap-global-set / with-eval-after-load (C-c C-a org-appear-toggle, R music radio-station, C-c n r/t roam recipe/topic) — same keys, verified live. Pull music-config helper defuns out of :config/with-eval-after-load to top level (their proper home; emms referenced only at call time via declare-function). Swap obsolete org-show-all for org-fold-show-all (9.6). Plus declare-function/defvar for lazy symbols. No behavior change; full suite + launch smoke green. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* chore(elisp): clear byte-compile warnings (elfeed, markdown, prog-general)Craig Jennings32 hours3-13/+45
| | | | | | The use-package :bind autoload stubs for own same-file commands collided with their defuns ("defined multiple times"). Move those bindings out of :bind to keymap-global-set / with-eval-after-load after the defun — same key, command, and map, verified live in the daemon. prog-general's case was instead a redundant same-file declare-function (removed). Plus declare-function/defvar for lazy package symbols, and mark-whole-buffer swapped for goto-char+push-mark in the elfeed tag helpers. No behavior change. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* chore(elisp): clear byte-compile warnings (org-noter, calendar-sync, vc, ↵Craig Jennings32 hours5-24/+133
| | | | | | | | dirvish, org-contacts) Add declare-function/defvar declarations for lazily-loaded package symbols and reflow over-long docstrings so these modules compile cleanly standalone. org-contacts keeps the diary special vars (date/entry/original-date) declared function-locally rather than file-wide, so the lexical `entry` parameter is unaffected. No behavior change. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* chore(elisp): clear byte-compile warnings (mail, dashboard, eshell, erc)Craig Jennings32 hours5-29/+175
| | | | | | Add declare-function/defvar declarations for lazily-loaded package functions and variables so each module compiles cleanly standalone, reflow over-long docstrings, and swap the obsolete erc-server-buffer-p for its named replacement erc-server-or-unjoined-channel-buffer-p (obsolete since 30.1). No behavior change. Two erc setq targets (erc-unique-buffers, erc-generate-buffer-name-function) appear not to be real ERC variables — declared to silence the warning with a NOTE flagging that the intended buffer-naming may not be taking effect. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* style(elisp): clear defcustom-group and dead-local byte-compile warningsCraig Jennings34 hours3-5/+15
| | | | | | Add :type and a containing :group to the three localrepo defcustoms (new localrepo defgroup) and to cj/org-agenda-window-height. Drop the unused `initial` local in the org-contacts completion-at-point function. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* fix(elisp): make dead let-bindings of foreign special vars take effectCraig Jennings34 hours2-0/+11
| | | | | | Byte-compile flagged three let-bindings of package vars as unused lexical variables — under lexical-binding they compiled to dead locals the package never saw, so the intended behavior silently never happened. Declare each var special so the binding is dynamic: music-config now actually suppresses the emms overwrite prompt on playlist save (emms-source-playlist-ask-before-overwrite) and turns off orderless smart-case for the music picker; org-roam copy-todo-to-today now actually applies its custom dailies capture template. Same class as the coverage-core json fix. Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
* chore(theme-studio): commit WIP theme locked-face reorderingCraig Jennings35 hours1-223/+229
| | | | Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ