aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* docs(claude): codify how rulesets-owned changes propagateCraig Jennings14 days1-0/+2
| | | | A bug or enhancement in a rulesets-owned synced file (a workflow, skill, rule, or script) is handled by editing the local copy, sending rulesets a copy plus an explanatory note, and letting it update the canonical and re-sync. A local edit alone is overwritten on the next template sync. Captured after running it twice this session.
* docs(spec): restructure keybinding spec to Path 2, defer the prefixCraig Jennings14 days1-85/+493
| | | | | | | | | | Processed the latest review comments on the keybinding-console-safety spec. Phase 0 is now a pure revert that unblocks the held push. Consolidation (migrate the common set, retire the translation block) is the primary phase. Binding the console-safe prefix becomes an optional, deferred Phase 3. The decisions gate splits to match: D2/D4/D5 gate the primary work, D1/D3 gate only Phase 3, so the work runs to the prefix-assignment point and stops there even if the prefix is never chosen. Corrected Appendix C: Meta transmits in the Linux console as an ESC prefix, so a free M-<punctuation> is a viable console-safe class, not just Control+letter. C-' is rejected: console-dead like C-;, and already bound to flyspell. Added Appendix D: every personal keybinding set outside the C-; tree and the M-S- family, as a checkbox pruning tree for a one-time audit of set-and-forgotten chords.
* fix(org-capture): make the desktop quick-capture popup behaveCraig Jennings14 days3-1/+411
| | | | | | | | | | The Hyprland Super+Shift+N popup opens a floating emacsclient frame named "org-capture" and runs a capture in it. Three things were wrong. The *Org Select* menu and the CAPTURE buffer split the small frame instead of filling it, so the daemon's last buffer leaked in beside two tmux-like modelines. The menu offered every template, including ones that can't work off the desktop: the pdf templates error outright, and the link and mu4e templates pull a link to whatever file the daemon last had open. And the frame only closed on a completed capture, so aborting at the menu or hitting an erroring template orphaned it. I added cj/quick-capture as the launcher's entry point instead of org-capture. It offers only Task, Bug, and Event, with Task and Bug retargeted to the global inbox since a desktop capture has no real project context, and it closes the popup frame on every exit path: finalize, abort, or error. A frame-scoped display-buffer-alist entry forces the menu and capture buffer into the frame's sole window, and an org-mks advice drops the Customize entry. Both gate on the "org-capture" frame name, so in-Emacs captures keep their windows. cj/quick-capture selects the "org-capture" frame by name before capturing rather than trusting the selected frame. The launcher runs before Hyprland settles focus on the new float, so the selected frame is still the main one and the capture would otherwise land there. Raised from the archsetup project.
* chore(todo): file ai-term adaptive window-placement taskCraig Jennings2026-06-121-11/+14
|
* docs(spec): messenger unification — settle decisions 3/6/9, smoke ↵Craig Jennings2026-06-121-13/+34
| | | | reference backend
* docs(spec): add keybinding console-safety spec (draft for review)Craig Jennings2026-06-121-0/+531
|
* fix(hooks): add edited file's dirs to byte-compile load-path for ↵Craig Jennings2026-06-121-0/+5
| | | | cross-project .el
* fix(dashboard): require recentf before touching recentf-excludeCraig Jennings2026-06-121-0/+1
| | | | cj/--dashboard-exclude-emms-from-recentf calls add-to-list on recentf-exclude, which is void until recentf loads. Init order guarantees it today, but a require makes the helper order-independent rather than dependent on load sequence.
* fix(ui-navigation): error clearly when undo-kill prefix exceeds the listCraig Jennings2026-06-122-2/+18
| | | | An out-of-range numeric prefix made (nth (1- arg) ...) return nil, and find-file on nil signaled a wrong-type-argument. Guard the index and raise a user-error naming how many killed files are available. A new test covers the out-of-range path.
* fix(org-drill): route drill-refile targets through the validated helperCraig Jennings2026-06-123-14/+34
| | | | The prior fix listed drill files with a raw directory-files call, bypassing cj/--drill-files-or-error, the shared validated entry point the other drill commands use. That skipped the missing/unreadable-dir user-error, fell through silently on an empty dir, and included leading-dot .org files the module otherwise excludes. Route through cj/--drill-files-or-error + expand-file-name, keeping the let binding so the session-wide org-refile-targets still survives. The test is rewritten into three: validated-helper targets, no global clobber, and a user-error on a missing drill dir.
* fix(dashboard): add EMMS exclusion to recentf-exclude without clobbering itCraig Jennings2026-06-123-3/+43
| | | | dashboard-config used setq on recentf-exclude, discarding the five exclusions system-defaults adds earlier in init order (bookmarks, elpa, recentf, ElfeedDB, airootfs). Extract the EMMS exclusion into cj/--dashboard-exclude-emms-from-recentf (the :config side-effect was not reachable for a test) and use add-to-list so prior entries survive. Two ERT tests cover preservation and the added pattern.
* fix(org-drill): let-bind org-refile-targets and target real drill filesCraig Jennings2026-06-123-12/+27
| | | | cj/drill-refile used setq, permanently replacing the session-wide org-refile-targets so every refile anywhere offered only drill targets until restart; and its (drill-dir :maxlevel . 1) entry named a bound variable, which org reads as a directory string rather than a file list, so the drill side yielded nothing. Let-bind org-refile-targets and supply (directory-files drill-dir t "\\.org$") as the file list. The stale test (which asserted the buggy drill-dir spec) is rewritten into two: file-list targets and no global clobber.
* fix(keys): bind eww/elfeed/calibredb launchers to the uppercase Meta eventCraig Jennings2026-06-125-5/+38
| | | | Meta+Shift+<letter> emits the uppercase event (M-E/M-R/M-B), so the M-S-e/M-S-r/M-S-b :bind specs on lowercase letters were never reached by the keychord and the three launchers were dead. Rebind them to M-E/M-R/M-B. Three ERT tests assert each chord resolves to eww, cj/elfeed-open, and calibredb respectively.
* fix(org-roam): put dailies #+FILETAGS and #+TITLE on separate linesCraig Jennings2026-06-123-4/+40
| | | | The "d" dailies head ran FILETAGS and TITLE together with no newline, so every C-c n d daily was malformed: Org never parsed #+TITLE and the FILETAGS value swallowed the rest of the line. Extracted the head into the cj/--org-roam-dailies-head defconst so it is unit-testable (the value was unreachable inside the use-package :custom form) and gave it real newlines. Two ERT tests assert the FILETAGS/TITLE line separation and the trailing newline.
* fix(ui-navigation): correct cj/undo-kill-buffer off-by-one on plain invocationCraig Jennings2026-06-123-63/+17
| | | | (interactive "p") forces arg >= 1, so the old (if arg (nth arg ...) (car ...)) always took the nth branch and plain M-S-z re-opened the second-most-recently-killed file. Index with (nth (1- arg) ...) so a numeric prefix is 1-based and no prefix re-opens the most recent. The two undo-kill tests now exercise the real no-prefix path (arg=1 reopens the first) and a 1-based numeric prefix; both failed against the bug and pass after. Filed a follow-up for a separate delq-vs-delete skip-visited defect found in the same function.
* chore(todo): apply verify-then-close to four code-complete tasksCraig Jennings2026-06-121-20/+41
| | | | Filed each task's pending manual check under the Manual testing and validation parent (relocated Signel's two existing checks, created three new ones), then closed the implementation tasks: Calibre bookmark naming, Calibre keybinding menu, Signel notify-only-for-unviewed-conversation, and project-aware capture.
* chore(todo): restrict tags to six, audit solo/quick, close finished tasksCraig Jennings2026-06-121-135/+135
| | | | Document the six allowed task tags (bug, feature, refactor, test, quick, solo) in the priority scheme and strip every other tag from Open Work, normalizing tests to test. Re-audit solo and quick against the rubric. Close three stale parents whose children all landed (org cache lifecycle, shell-command audit, UI/navigation hardening) and drop a duplicate ghostel Phase 2 task already logged as done.
* chore(todo): add priority cookies and tidy localrepo spacingCraig Jennings2026-06-121-8/+4
|
* chore(constants): point website-dir at code/websiteCraig Jennings2026-06-121-1/+1
|
* chore(dirvish): point phl quick-access at projects/homeCraig Jennings2026-06-121-1/+1
|
* chore(todo): move palette-columns VERIFY to section endCraig Jennings2026-06-121-1045/+1045
|
* chore(dirvish): update quick-access paths for projects/home layoutCraig Jennings2026-06-121-6/+6
|
* chore(todo): log 2026-06 config-audit findings and brainstorm tasksCraig Jennings2026-06-121-2/+387
| | | | Full audit of all 121 modules plus init/early-init, four holistic passes (startup/perf, stability, UX consistency, packages), and spin-off reviews of pearl, chime, and emacs-wttrin. ~235 findings: 40 high-impact bugs as standalone tasks, the rest under the audit parent's group children, with a synthesis child carrying the attack order. Also files the messenger-unification, Google Voice, and Google Contacts brainstorm tasks.
* docs: add messenger window/key unification spec (draft)Craig Jennings2026-06-121-0/+187
|
* chore(theme-studio): record verification passes, file preview-fix tasksCraig Jennings2026-06-112-461/+637
| | | | Five manual checks verified, closing the contrast-cell and preview-bg bugs. An audit of the bespoke previews found three face mislinks (org headline-todo, erc input/default swap, flycheck delimiter swap) — filed with picker-visibility and Rust+Zig sample tasks. WIP theme picks up the revised steel selections.
* chore(dirvish): update jr-estate quick-access path to projects/homeCraig Jennings2026-06-111-1/+1
|
* chore(todo): task-review stamps, tags, and dupre-test decisionsCraig Jennings2026-06-111-4/+27
|
* chore(theme-studio): snapshot WIP palette filesCraig Jennings2026-06-116-431/+31817
|
* chore(claude): add org-tables rule from bundle syncCraig Jennings2026-06-111-0/+60
|
* chore(dirvish): update clipper quick-access path to projects/homeCraig Jennings2026-06-111-1/+1
|
* chore(todo): close telegram task, file signel notify manual checksCraig Jennings2026-06-111-3/+19
|
* chore(claude): sync bundle rule updatesCraig Jennings2026-06-112-0/+62
|
* chore(todo): file telegram mark-read task, close signel send verify, start ↵Craig Jennings2026-06-111-21/+8
| | | | notify slice
* feat(signal): route message toasts through the notify scriptCraig Jennings2026-06-114-1/+311
| | | | Incoming messages now notify through cj/signel--notify, installed as the fork's signel-notify-function. It suppresses the toast while that chat is in the selected window of a focused frame, collapses and truncates the body to 120 characters, and sends through the notify script (info type, --silent unless cj/signel-notify-sound is set). Without the script on PATH it falls back to notifications-notify and warns at load. The decisions are in the Notification slice addendum of docs/design/signal-client.org.
* chore(todo): file spec-review and memory-sweep tasks, archive closed workCraig Jennings2026-06-111-28/+35
| | | | Adds the scheduled palette-columns spec review, the agent-KB memory-sweep task from the rulesets rollout, and a preview window-split issue; the closed bevel and color-harmony tasks move to Resolved.
* refactor(constants): point roam-dir at the standalone roam repoCraig Jennings2026-06-111-2/+4
| | | | The org-roam KB moved out of the Syncthing share into its own git repo at ~/org/roam (cjennings.net:roam.git). journals-dir, inbox-file, and reading-notes-file derive from roam-dir and follow without edits.
* feat(org-capture): auto-close the quick-capture popup frameCraig Jennings2026-06-101-0/+14
| | | | A Hyprland keybind (Super+Shift+N) now opens an emacsclient frame named org-capture for one-shot captures. The new after-finalize hook deletes that frame on C-c C-c or C-c C-k, matching the popup-frame pattern; frames with any other name are untouched, so in-Emacs captures behave as before.
* chore(todo): close the bevel task on Craig's sign-offCraig Jennings2026-06-101-6/+4
|
* docs(spec): draft declared-palette-columns specCraig Jennings2026-06-101-0/+119
|
* chore(todo): log the bevel port and file its side-by-side checkCraig Jennings2026-06-101-0/+7
|
* fix(theme-studio): derive box bevel colors from the face backgroundCraig Jennings2026-06-105-16/+150
| | | | The released/pressed bevel was a flat translucent white/black overlay, which reads weaker than the box Emacs draws. reliefColors in colormath.js now ports Emacs 30's x_alloc_lighter_color: highlight = bg x1.2, shadow = bg x0.6, an additive boost for dark backgrounds, and the same-color fallback for pure black and white. boxCss takes the face's effective bg and derives both edges from it. Pressed swaps the pair, and the translucent pair remains only when no bg is known. Width stays 1px because dupre's :line-width -1 draws 1px lines in Emacs too. The gap was color strength, not width. Five node tests pin hand-computed fixtures from the C source, and a new #beveltest gate pins the wiring.
* chore(todo): close the color-harmony explainer taskCraig Jennings2026-06-101-1/+4
|
* docs(design): add theme-studio color-harmony explainerCraig Jennings2026-06-101-0/+77
|
* fix(theme-studio): re-rate fallback contrast cells on default-fg changeCraig Jennings2026-06-102-2/+30
| | | | A default-fg (p) change only re-rated the covered overlay faces. UI-face and package ratios that fall back to the default fg kept their old number until something else rebuilt the tables. The p branch now runs the same repaint as a ground-bg change. The new #contrasttest assertion drives the real syntax dropdown (unlocking a locked p row for the test) so the handler wiring is pinned, not just the repaint helper.
* chore(todo): log the applyGround diagnosis and file its manual checkCraig Jennings2026-06-101-1/+12
|
* fix(theme-studio): scope applyGround and repaint faces on ground changeCraig Jennings2026-06-102-6/+56
| | | | The contrast cells already rated a two-color face's own fg-on-bg. They read wrong because applyGround blanketed every .ex cell (the per-face preview cells included) with the ground bg, and a ground-bg change never repainted the UI or package tables. The preview showed fg on the ground bg next to a correct fg-on-face-bg ratio, and ground-dependent ratios went stale. applyGround now blankets only the code panes and syntax example cells and repaints UI faces through paintUI. The ground-bg handler also rebuilds the package table and preview. New #contrasttest assertions pin the two-color pair in both tables, preview-bg survival, and ground-change re-rating.
* chore(todo): task-review re-stamps, quick/solo tags, explainer retitleCraig Jennings2026-06-101-4/+25
|
* chore(todo): reword literal stars that org-lint reads as headingsCraig Jennings2026-06-101-2/+2
| | | | org-lint's misplaced-heading checker flags any mid-line "** " in a paragraph. The quoted "** TODO" examples in two manual-test Expected lines tripped it.
* fix(theme-studio): guard Chrome profile dir and bound headless rendersCraig Jennings2026-06-101-2/+5
| | | | A headless render with an empty --user-data-dir falls back to the real Chrome profile and takes its SingletonLock. A hung render held that lock for 18 hours on 2026-06-09, blocking every interactive Chrome launch. The runner now refuses to run the browser gates when mktemp fails, and each render runs under timeout --kill-after so a wedged Chrome dies in seconds.
* chore(todo): archive resolved theme-studio tasks to ResolvedCraig Jennings2026-06-101-113/+108
|