| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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
|
| |
|
|
|
|
| |
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
|
| |
|
|
|
|
|
|
| |
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
|
| |
|
|
|
|
| |
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
|
| |
|
|
|
|
| |
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
|
| |
|
|
|
|
|
|
| |
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
|
| |
|
|
|
|
| |
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
|
| |
|
|
|
|
| |
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
|
| |
|
|
|
|
| |
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
|
| |
|
|
| |
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Stop scanning org-roam notes tagged "Project" for refile targets; keep the "Topic" scan. Behavior change by decision: roam Projects are no longer pulled in anywhere (the agenda never scanned them either — that was a stale doc claim, corrected separately). Refiling into Topic notes and into per-project todo.org files is unchanged. Test reworked to assert Topic is included and Project is not.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
| |
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
cj/--org-agenda-base-files now drops files that do not exist (a fresh machine may lack the synced calendars or the inbox), and org-agenda-skip-unavailable-files is set as a backstop, so org-agenda never prompts to create a missing path — the interactive-prompt class that once hung the chime daemon. The filter lives in the one shared helper, so the agenda builders, single-project view, and the chime initializer all get the existence check. Also correct the docs: the commentary and docstrings claimed org-roam nodes tagged "Project" are agenda sources, but they were never scanned; roam Project/Topic notes are refile targets (org-refile-config.el), not agenda sources.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Close the task with the three functions shipped and unit-verified, and file the tmux/shutdown side effects and both-sides workflow run as a VERIFY under Manual testing and validation.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Add the three headless functions the rulesets wrap-it-up workflow calls via emacsclient -e, since this module owns the aiv- session naming, the agent buffer, and the geometry restore. cj/ai-term-quit kills a project's tmux session and agent buffer and restores the layout, idempotent and safe when already gone. cj/ai-term-live-count returns the integer count of live aiv- sessions for the shutdown safety gate. cj/ai-term-shutdown-countdown re-checks that gate, then runs an abort-able run-at-time countdown in the echo area and, uncancelled, runs the shutdown command (a defcustom so tests stub it). Reuses the existing kill/close helpers. 13 ERT tests cover the live-count parsing, the quit kill-and-idempotency, and the gate-abort/cancel/tick logic; the tmux and shutdown side effects are manual.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
| |
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Bump the Emacs floor to 30 (developed on 30.2). Fix the module count (~100 to ~120), add docs/ to the layout, and reword scripts/ now that it also holds theme-studio. Add Theme Studio, the ghostel native terminal, and ai-term to Features, and make coverage-summary to the dev targets.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
| |
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Mark the nerd-icons colors PROJECT DONE with its four phases as dated event-log entries, promote the vNext follow-ups to a standalone [#D] task, and file the live-visual check as a VERIFY under Manual testing and validation.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Lock the dir-precedence decision with an ERT probe: when a dir icon already carries nerd-icons-completion-dir-face, the advice's prepended nerd-icons-yellow is first in the face list and wins. Extend the #nerdiconstest browser gate with an export/import round-trip over an assigned nerd-icons color, asserting it re-imports to the same state and that the separate nerd-icons-completion dir-face stays out of the nerd-icons app.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Remove cj/nerd-icons-tint-color, cj/--nerd-icons-color-faces, cj/nerd-icons-apply-tint and its two call sites, so the 34 nerd-icons color faces are no longer force-set to one darkgoldenrod foreground at load time. The WIP theme already owns those faces (theme-studio auto-discovered them), so with the tint gone their per-filetype colors come from the theme and are editable in theme-studio's new nerd-icons pane. The dir-icon advice (cj/--nerd-icons-color-dir) stays — it points at a theme-owned face now. Delete the apply-tint test, which covered removed code.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Register nerd-icons as a bespoke app whenever its captured legend is valid: the 34 color faces stay editable rows, and the legend rides APPS['nerd-icons'].legend. A new renderNerdIconsPreview draws each curated filetype's glyph in its mapped face's effective color, read through the same registry the other previews use, so recoloring a face repaints every row mapped to it. When the legend is absent the generic inventory app stands in. The #nerdiconstest browser gate covers the wiring, the dir-row owner, and the recolor-repaint.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Add build-nerd-icons-legend.el, which resolves the curated v1 legend rows (glyph + owner color face per filetype) from the live nerd-icons alists and dumps them to nerd-icons-legend.json, a committed artifact like package-inventory.json. generate.py gains load_nerd_icons_legend, which validates the artifact and returns None — with a warning — when it is absent, malformed, empty, or missing a field, so the page can fall back to the generic nerd-icons app rather than error. Data only; the bespoke preview that renders it lands next.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Ready confirmed; run the spec-response Phase 6 breakdown. Convert the spec task to a PROJECT and file the four implementation phases (legend capture, bespoke preview, atomic theme-assignment + tint removal, verification) as solo children.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
The mu4e cmail trash-folder + per-message refile fix shipped 2026-06-13 but the task stayed DOING; close it DONE and file the live-mail check as a VERIFY under Manual testing and validation.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Only the copy-mode scroll check was confirmed; restore the face-name button and latexmk manual VERIFYs to pending.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Craig confirmed the copy-mode scroll, face-name buttons, and latexmk compile all work in a live frame; rewrite each VERIFY to a dated event-log entry.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Close the copy-mode regression task with its resolution, and restore the ai-term wrap-teardown heading that was dropped when the bug task was filed. Update the copy-mode manual VERIFY for the C-<up>-only behavior.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Today's modified-arrow work bound every C-arrow and M-arrow to copy-mode, which swallowed C-<left>/C-<right> — readline word-motion at the shell prompt. Bind only C-<up> (enter copy-mode and scroll up); the other arrows pass through to the terminal again. C-<up> pressed while already in copy-mode now just moves up: cj/term-copy-mode-up checks tmux pane_in_mode (and ghostel--input-mode without tmux) and skips re-entry, which would otherwise reset the cursor to the start of the line.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
| |
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Record the coverage-core failure: let-binding json.el's reader vars in a lexical-binding file without a compile-time defvar makes the compiled code bind them lexically, so they never reach json-read-file. Same compiled-vs-interpreted class as the existing make-test and native-comp insights.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
The simplecov parse helpers let-bound json-object-type, json-array-type, and json-key-type around json-read-file to get string-keyed hash tables. Under lexical-binding the compiler hadn't seen json.el's defvars, so it compiled those as lexical bindings that never reached the reader; the compiled helpers got json.el's default symbol-keyed alist and then signaled wrong-type-argument hash-table-p in their maphash. Interpreted code happened to work because the in-function require made the vars special first. Add eval-when-compile (require 'json) so the compiler treats them as dynamic.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Close the modified-arrow copy-mode, face-diagnostic buttons, and latexmk activation tasks, and file their residual hands-on checks as VERIFYs under Manual testing and validation.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Two breaks kept latexmk from ever engaging. The :hook key TeX-mode-hook expanded to the unbound TeX-mode-hook-hook, since use-package appends -hook to any symbol not ending in -mode, so TeX-command-default was never set; name the mode TeX-mode instead. Separately auctex-latexmk was :defer t with no trigger, so auctex-latexmk-setup never ran and latexmk never joined TeX-command-list; load it :after tex.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Render each real face name in the Face Diagnosis report as a button that runs describe-face on it, carrying the face as button data; anonymous specs and non-faces stay plain text. Also add face-diagnostic to the module-header allowlist now that it is required in init.el and carries the header contract.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
C-<arrow> and M-<arrow> in a ghostel buffer now enter copy-mode and move one step in that direction in a single stroke. The tmux path writes the arrow escape sequence into the pty so the copy cursor follows it; without tmux the same keys enter ghostel-copy-mode and move point. All eight keys join ghostel-keymap-exceptions and the semi-char map is rebuilt, so they reach Emacs instead of the terminal program.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
| |
theme-studio coverage, google-keep)
|
| |
|
|
| |
Round-3 Codex review flagged one blocker: summary/readiness/risk text still described the superseded contracts (native color capture, build-inventory.el, dual dir-row sources). Reconciled the Scope tiers, For-the-implementer summary, legend source paragraph, three readiness dimensions, and the Risks section to match the resolved decisions. No decision changed, only the lagging prose. Findings 10/10, decisions 6/6, Ready pending go.
|
| |
|
|
| |
Folded the six round-2 Codex blockers into the spec. Added the explicit 13-row v1 legend table and the missing-key rule. Settled dir-color precedence (the dir advice prepends nerd-icons-yellow, so it wins) and cross-package ownership (the bespoke pane owns only nerd-icons faces; nerd-icons-completion-dir-face stays in its own app). Named the concrete legend artifact and its failure behavior, reordered into an atomic assign-then-drop-tint phase, and added a contract-by-contract test plan. Findings 9/9, decisions 6/6. Ready pending go.
|
| |
|
|
| |
Flipped the legend-rendering decision: v1 draws the actual nerd-font glyph in its assigned color rather than a swatch + label. The deferral rested on an unverified font dependency; Nerd Fonts are installed system-wide, so Chrome renders the glyphs from a font-family rule with no @font-face or font file. Monospace fallback for absent fonts; the gate asserts the glyph char and inline color.
|
| |
|
|
| |
Folded the three blocking Codex findings into the spec. Added the legend data contract (row schema, per-category sources, v1 scope). Corrected the native-color seed to ride the existing default-face pipeline rather than a new build-inventory.el capture that would double-seed. Resolved all six decisions. Spec is Ready pending Craig's go.
|
| |
|
|
| |
Drafts the spec to drop the runtime nerd-icons tint (so icon color is theme-driven) and add a theme-studio filetype-legend representation over the 34 nerd-icons-* color faces. Five decisions left open for review: color model, legend scope, seed source, config sequencing, and the dir advice. Filed the cross-linked task in todo.org.
|
| | |
|
| |
|
|
| |
Map the cj: src-block language to org-mode via org-src-lang-modes, so the prose inside a cj comment block (#+begin_src cj: comment ...) gets org font-lock in place and C-c ' opens an org-mode buffer to edit it. The block stays a src block, so the cj: grep marker and the cj-processing pipeline are unchanged.
|
| | |
|
| |
|
|
|
|
|
|
| |
I moved the ai-term family off the F9 keys onto the C-; a prefix, vacated when gptel was archived: a toggles the agent, s opens the project picker, n swaps to the next agent, k closes one. The frequent swap also gets M-SPC as a fast chord, bound in ghostel-mode-map and added to the semi-char exceptions so it reaches Emacs from inside an agent buffer.
cj/ai-term-next now opens the project picker when no agent is running instead of erroring, so the swap key doubles as a "start an agent" key.
To free M-SPC, I removed jumper's M-SPC binding. Jumper's commands stay reachable via M-x, with a cleverer home pending review.
|
| |
|
|
| |
Routed the four emacs-prefixed items from the shared roam inbox: filed three new tasks (ai-term keybinding home, completion-icon face, org formatting inside cj comments) and folded the control-arrow tmux copy-mode capture into the existing M-arrow copy-mode task.
|
| |
|
|
| |
After archiving gptel, I moved its feature backlog (renamed to "GPTel orphan tasks and useful ideas") and the gptel-dependent Org-native API workspace design out of Open Work into Someday/Maybe, each with a note on what happened and why they're kept. Most of the child tool ideas are agent-tool concepts that would transfer to the ai-term agents or an MCP layer, so they're reference rather than active work.
|