aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Add theme studio UI inherit spec taskCraig Jennings14 days1-1/+7
|
* Add theme studio generated file checkCraig Jennings14 days2-1/+12
|
* Rename theme studio column browser gateCraig Jennings14 days4-10/+10
|
* Pin theme studio generated defaultsCraig Jennings14 days1-0/+32
|
* Refactor theme studio face assemblyCraig Jennings14 days8-61/+205
|
* docs(claude): codify the make-test no-package-init testability gotchaCraig Jennings14 days1-0/+2
| | | | make test runs without package-initialize, so defuns nested in a use-package :config are unbound there even though the PostToolUse hook loads them. Extract such logic to top-level for unit tests; verify :config-bound keys live.
* Rename theme studio color model to columnsCraig Jennings14 days5-187/+187
|
* Guard theme studio package face coverageCraig Jennings14 days1-0/+35
|
* Extract theme studio default face adapterCraig Jennings14 days3-81/+203
|
* Update theme studio color columns and defaultsCraig Jennings14 days10-460/+30503
|
* fix(dwim-shell): valid zip name, real backup timestamp, reachable menu keyCraig Jennings14 days4-6/+59
| | | | Three audit fixes. Single-file zip named the archive after the input file (<<fne>>.<<e>>), making invalid archives and a "foo." name for directories. It now builds <fne>.zip. The dated backup single-quoted $(date ...), so the stamp sat literal in the filename. Now the timestamp is interpolated in Elisp with format-time-string. The dired menu used "M-S-d", which Meta-Shift-d never emits (it sends M-D), so the menu was unreachable in plain dired. It now binds M-D, matching the dirvish sibling. Both command strings moved to top-level builders so they're unit-testable without loading the dwim-shell-command package.
* fix(markdown): restore the live preview (rename, guard, dead setq)Craig Jennings14 days3-7/+23
| | | | F2 ran markdown-mode's own markdown-preview instead of the custom one, so the impatient-mode strapdown preview was dead. I renamed the custom command to cj/markdown-preview and rebound F2 so markdown-mode no longer shadows it. The server guard now uses httpd-running-p (httpd-process isn't a variable), and a dead (setq imp-set-user-filter 'markdown-html) that named neither a real variable nor a real filter is gone.
* fix(completion): let orderless match, prescient sortCraig Jennings14 days2-1/+13
| | | | vertico-prescient-mode defaulted vertico-prescient-enable-filtering to t, which overrode completion-styles to prescient inside vertico sessions and left the orderless config dead where it mattered. Setting it nil restores orderless space-separated out-of-order matching while prescient keeps doing the sorting.
* fix(keys): destructive delete on capital D, diff on lowercase dCraig Jennings14 days3-3/+41
| | | | C-; b d now runs cj/diff-buffer-with-file (the op I hit most, comparing a buffer against the saved file) and C-; b D runs cj/delete-buffer-and-file. The destructive command sat on the easy lowercase key and diff on the capital. A keymap-lookup test guards the swap.
* docs(claude): codify the manual-verification VERIFY-child patternCraig Jennings14 days1-0/+2
| | | | When a task's code is done and only the hands-on check remains, file that check as a VERIFY child under the Manual testing and validation parent and close the originating task, instead of leaving the whole task DOING.
* chore(todo): import emacs tasks from roam inboxCraig Jennings14 days1-1/+270
| | | | Routed six Emacs items out of the roam global inbox into Open Work: unified popup placement/dismissal rules, fullscreen-terminal pull-away, removing unused system-power keybindings, two dirvish/buffer keybinding tweaks, and F1 dashboard-refresh (folded into the existing dashboard task). Each rewritten, priced, and tagged per the project scheme.
* chore(todo): stamp reviewed tasks, mark two audit fixes DOINGCraig Jennings14 days1-2/+37
| | | | Task-review batch of 7 stamped :LAST_REVIEWED: 2026-06-13, all kept; reconcile-open-repos gained :quick:. The C-s vertico-repeat and dotted-repo fixes moved to DOING with dated resolution notes and manual-test entries under the validation parent, pending my confirm.
* fix: vertico-repeat C-s and dotted-repo discovery (audit bugs)Craig Jennings14 days4-1/+24
| | | | | | | | | Two bugs from the 2026-06 config audit. - C-s C-s never repeated a search. cj/consult-line-or-repeat calls vertico-repeat on the second press, but vertico-repeat-save was never on minibuffer-setup-hook, so it always signalled "No Vertico session". I hooked vertico-repeat-save next to the vertico block. It's autoloaded, so the load defers to the first minibuffer. - reconcile-open-repos skipped any repo with a dot in its name. cj/find-git-repos filtered children through "^[^.]+$", which matches only dot-free names, so mcp.el, capture.el, and google-contacts.el were never reconciled while M-P still reported "Complete". It now filters through directory-files-no-dot-files-regexp plus a hidden-dir guard, so dotted repos pass and .git stays out. Each fix is test-first: a failing assertion (hook membership, three dotted repos found) precedes the change.
* chore(todo): mark audit-bug fixes DOING, stamp reviewed tasksCraig Jennings2026-06-131-4/+25
|
* chore: sync .claude rules from rulesets (cross-project, todo-format)Craig Jennings2026-06-132-0/+63
|
* fix: lock-screen, confirm-tier, and mail-folder audit bugsCraig Jennings2026-06-1310-13/+164
| | | | | | | | | | Lock screen: slock is X11-only and never grabbed the Wayland session, so C-; ! l silently did nothing. On Wayland the locker now runs loginctl lock-session, which logind turns into a Lock signal that hypridle handles by running hyprlock, the same path idle and before-sleep locking already use. X11 keeps slock. system-commands.el now also requires host-environment, which it used at load time but never declared. Confirmation tier: the global (fset 'yes-or-no-p 'y-or-n-p) plus use-short-answers t both flattened yes-or-no-p to a single keystroke, so the deliberate strong-confirm tier for irreversible actions was dead. A stray space could power off the machine or destroy files. I added cj/confirm-strong, which binds use-short-answers nil for one call to force a typed "yes", and routed the six irreversible sites through it (shutdown/reboot, permanent file destruction, file overwrites). I dropped the redundant fset and kept use-short-answers t so ordinary prompts stay single-key. Mail folders: the cmail context set no trash folder, so D fell back to a nonexistent /trash, and no context set a refile folder, so r targeted a nonexistent /archive everywhere. Accepting mu4e's offer to create the maildir stranded mail where mbsync never syncs it. cmail now trashes to /cmail/Trash. Refile is computed per message rather than per context, because mu4e context :vars are sticky and a per-context refile would leak one account's archive folder into another. cmail archives to /cmail/Archive. The Gmail-backed accounts have no synced archive maildir, so they signal rather than move mail into an unsynced folder. Lock and confirm-tier need a daemon restart to fully take effect. The mail changes apply on next mu4e open.
* chore(todo): file keymap + capture follow-up tasks, archive resolved workCraig Jennings2026-06-132-70/+72
| | | | New Keymap-consolidation [#B] and deferred Note/Recipe [#D] tasks, plus cross-refs on the prog-hooks and org-capture manual-test tasks. Archived the CANCELLED launcher task and two other resolved subtrees into Resolved. Gitignore the smoke.db runtime artifact.
* fix(snippets): stop electric-pair from stranding ">" after "<"-key snippetsCraig Jennings2026-06-132-0/+70
| | | | | | | | Most of the yasnippet keys start with "<" (<cj, <for, <main, ...), mirroring org-tempo. electric-pair-mode pairs "<" into "<>" wherever the mode's syntax table gives "<" paren syntax, which org and the pairing-enabled prog modes both do. So typing "<cj" lands as "<cj>", and expanding the "<cj" key strands the ">" after the snippet. The cj-comment block came out with a "#+end_src>" close fence, which breaks the cj-scan fence parser and made every respond-to-cj-comments pass hand-parse around it. I set electric-pair-inhibit-predicate globally to inhibit the open angle bracket and defer to the default for every other character. That keeps the "<"-prefixed snippet convention intact across all 14 of them, at the cost of "<>" auto-pairing where it might otherwise be wanted (C++ templates). The snippet convention is universal, so it wins. Surfaced from the smoke project, which kept hitting the malformed fence in its todo.org.
* fix(keys): revert 4a1ecf64, restore the M-S- launcher bindingsCraig Jennings2026-06-135-38/+6
| | | | | | | | 4a1ecf64 rebound eww/elfeed/calibredb from M-S-e/r/b to the uppercase Meta events M-E/M-R/M-B, on the theory that the keyboard emits the uppercase event and the lowercase-shift spec never matched. It was wrong. keyboard-compat.el installs a key-translation-map entry (M-E -> M-S-e, etc.) in GUI frames, so the original M-S- bindings did reach the launchers. Binding M-E directly while that translation stayed in place rewrote the keypress to the now-unbound M-S-e, breaking all three in GUI on the next restart. The audit and the review missed it because they checked key-binding, which ignores key-translation-map, and the running daemon still held the pre-fix bindings as stale state. This restores M-S-e/r/b, deletes the key-binding-only test that certified the broken config, and reclassifies the task as not-a-bug. The real problem, that these chords are dead outside GUI, is the subject of the keybinding-console-safety spec.
* docs(claude): codify how rulesets-owned changes propagateCraig Jennings2026-06-131-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 Jennings2026-06-131-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 Jennings2026-06-133-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
|