aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Add theme studio column deleteCraig Jennings5 days8-13/+106
|
* Refactor theme studio palette testsCraig Jennings5 days9-679/+835
|
* Add theme studio palette clear and lock togglesCraig Jennings5 days3-10/+112
|
* Fix theme studio ground column orderCraig Jennings5 days2-12/+34
|
* Fix theme studio bg-prefixed span inferenceCraig Jennings5 days4-12/+26
|
* Queue theme studio column deletion taskCraig Jennings5 days1-0/+8
|
* Fix theme studio style button stateCraig Jennings5 days2-2/+26
|
* Fix theme studio bg-like imported colorsCraig Jennings5 days5-44/+111
|
* Add theme studio palette generator specCraig Jennings5 days2-0/+249
|
* Add theme studio column selection and reorder controlsCraig Jennings5 days3-10/+120
|
* Set theme studio default picker colorCraig Jennings5 days3-12/+14
|
* Group numeric color names by stemCraig Jennings5 days5-4/+16
|
* Document theme studio import color inferenceCraig Jennings5 days1-0/+2
|
* Treat legacy color names as base columnsCraig Jennings5 days6-4/+39
|
* Retire stale theme studio todo entriesCraig Jennings5 days1-3/+9
|
* Split theme studio generator data and templateCraig Jennings5 days4-384/+394
|
* Add theme studio default face drift summaryCraig Jennings5 days3-1/+102
|
* docs(claude): codify the cl-letf C-primitive native-comp trampoline trapCraig Jennings5 days1-0/+2
| | | | Mocking a C primitive (buffer-modified-p, file-exists-p, kill-buffer) via cl-letf triggers a native-comp trampoline rebuild that fails under --batch. Drive real state or extract a pure helper instead.
* Pin theme studio preview links and column exportsCraig Jennings5 days4-10/+58
|
* fix(help-config): non-destructive info open, clean cancel, drop dead configCraig Jennings5 days3-23/+68
| | | | Three audit defects in one file. cj/open-with-info-mode used cl-return-from inside a plain defun, so declining the save prompt threw "No catch for tag" instead of cancelling. The decision is now a pure cj/--info-open-plan and the command routes through it. A dead :hook (info-mode . info-persist-history-mode, which names a non-existent mode on the wrong hook) and an empty :preface are gone. The auto-mode-alist entry that mapped .info to that interactive, buffer-killing command is dropped, so find-file-noselect of a .info no longer destroys buffers. cj/open-with-info-mode stays an M-x command and C-h i still browses info files.
* Add theme studio UI inherit spec taskCraig Jennings5 days1-1/+7
|
* Add theme studio generated file checkCraig Jennings5 days2-1/+12
|
* Rename theme studio column browser gateCraig Jennings5 days4-10/+10
|
* Pin theme studio generated defaultsCraig Jennings5 days1-0/+32
|
* Refactor theme studio face assemblyCraig Jennings5 days8-61/+205
|
* docs(claude): codify the make-test no-package-init testability gotchaCraig Jennings5 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 Jennings5 days5-187/+187
|
* Guard theme studio package face coverageCraig Jennings5 days1-0/+35
|
* Extract theme studio default face adapterCraig Jennings5 days3-81/+203
|
* Update theme studio color columns and defaultsCraig Jennings5 days10-460/+30503
|
* fix(dwim-shell): valid zip name, real backup timestamp, reachable menu keyCraig Jennings5 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 Jennings5 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 Jennings5 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 Jennings5 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 Jennings5 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 Jennings5 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 Jennings5 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 Jennings5 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 Jennings5 days1-4/+25
|
* chore: sync .claude rules from rulesets (cross-project, todo-format)Craig Jennings6 days2-0/+63
|
* fix: lock-screen, confirm-tier, and mail-folder audit bugsCraig Jennings6 days10-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 Jennings6 days2-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 Jennings6 days2-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 Jennings6 days5-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 Jennings6 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 Jennings6 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 Jennings6 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 Jennings6 days1-11/+14
|
* docs(spec): messenger unification — settle decisions 3/6/9, smoke ↵Craig Jennings6 days1-13/+34
| | | | reference backend
* docs(spec): add keybinding console-safety spec (draft for review)Craig Jennings6 days1-0/+531
|