aboutsummaryrefslogtreecommitdiff
path: root/todo.org
Commit message (Collapse)AuthorAgeFilesLines
* fix(slack): autoload w/@/# commands, guard close-all, register the prefixCraig Jennings2026-06-141-1/+9
| | | | Three lifecycle gaps that bit before slack loads. The w / @ / # keys bound slack-message-write-another-buffer, slack-message-embed-mention, and slack-message-embed-channel, none autoloaded or in :commands, so they void-function'd before slack started; added them to :commands. cj/slack-close-all-buffers read slack-current-buffer via buffer-local-value on every buffer, which signals void-variable on buffers without the local binding; it now guards with buffer-local-boundp like its sibling. And C-; S was bound with a raw global-set-key, invisible to the keybindings registry; it now registers through cj/register-prefix-map like the signal and erc prefixes.
* fix(erc): one mention notification, real server list, runtime requireCraig Jennings2026-06-141-1/+17
| | | | Three audit defects. erc-modules carried the built-in notifications module while :config also added cj/erc-notify-on-mention to the same erc-text-matched-hook, so every mention popped two desktop notifications. Dropped notifications from erc-modules and kept the custom one. cj/erc-connected-servers compared a buffer's erc-server-process to itself inside with-current-buffer (always true), so it returned every ERC buffer; it now filters on erc-server-buffer-p and erc-server-process-alive. And user-constants moved from an eval-when-compile-only require to a runtime require, since user-whole-name is read at load time for erc-user-full-name.
* fix(modeline): drop per-render truename, guard vc fetch against signalsCraig Jennings2026-06-141-1/+18
| | | | The VC modeline cache rebuilt its key every render, and the key included file-truename, so a stat ran on every redisplay rather than once per refresh as the comment claimed. Now it keys on (file show-remote). A moved symlink target is caught at the next TTL refresh, when vc-backend resolves the link fresh. And cj/modeline-vc-fetch is wrapped in condition-case returning nil, so a git signal on a slow or unmounted filesystem degrades to no-VC-info instead of breaking all redisplay.
* Refine theme studio tile name editingCraig Jennings2026-06-131-1/+3
|
* Migrate roam inbox tasks to todoCraig Jennings2026-06-131-0/+36
|
* Add theme studio Rust and Zig samplesCraig Jennings2026-06-131-1/+3
|
* Fix theme studio column delete task hashCraig Jennings2026-06-131-1/+1
|
* Add theme studio column deleteCraig Jennings2026-06-131-1/+3
|
* Queue theme studio column deletion taskCraig Jennings2026-06-131-0/+8
|
* Add theme studio palette generator specCraig Jennings2026-06-131-0/+8
|
* Document theme studio import color inferenceCraig Jennings2026-06-131-0/+2
|
* Treat legacy color names as base columnsCraig Jennings2026-06-131-0/+11
|
* Retire stale theme studio todo entriesCraig Jennings2026-06-131-3/+9
|
* fix(help-config): non-destructive info open, clean cancel, drop dead configCraig Jennings2026-06-131-1/+9
| | | | 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 Jennings2026-06-131-1/+7
|
* fix(dwim-shell): valid zip name, real backup timestamp, reachable menu keyCraig Jennings2026-06-131-1/+9
| | | | 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 Jennings2026-06-131-1/+9
| | | | 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 Jennings2026-06-131-1/+8
| | | | 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 Jennings2026-06-131-1/+9
| | | | 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.
* chore(todo): import emacs tasks from roam inboxCraig Jennings2026-06-131-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 Jennings2026-06-131-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.
* chore(todo): mark audit-bug fixes DOING, stamp reviewed tasksCraig Jennings2026-06-131-4/+25
|
* fix: lock-screen, confirm-tier, and mail-folder audit bugsCraig Jennings2026-06-131-0/+14
| | | | | | | | | | 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-131-70/+71
| | | | 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(keys): revert 4a1ecf64, restore the M-S- launcher bindingsCraig Jennings2026-06-131-3/+3
| | | | | | | | 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.
* fix(org-capture): make the desktop quick-capture popup behaveCraig Jennings2026-06-131-0/+8
| | | | | | | | | | 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
|
* fix(org-drill): route drill-refile targets through the validated helperCraig Jennings2026-06-121-0/+2
| | | | 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-121-2/+3
| | | | 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-121-2/+3
| | | | 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-121-2/+3
| | | | 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-121-2/+3
| | | | 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-121-51/+6
| | | | (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(todo): move palette-columns VERIFY to section endCraig Jennings2026-06-121-1045/+1045
|
* 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.
* chore(theme-studio): record verification passes, file preview-fix tasksCraig Jennings2026-06-111-46/+53
| | | | 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(todo): task-review stamps, tags, and dupre-test decisionsCraig Jennings2026-06-111-4/+27
|
* chore(todo): close telegram task, file signel notify manual checksCraig Jennings2026-06-111-3/+19
|
* chore(todo): file telegram mark-read task, close signel send verify, start ↵Craig Jennings2026-06-111-21/+8
| | | | notify slice
* 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.
* chore(todo): close the bevel task on Craig's sign-offCraig Jennings2026-06-101-6/+4
|
* chore(todo): log the bevel port and file its side-by-side checkCraig Jennings2026-06-101-0/+7
|
* chore(todo): close the color-harmony explainer taskCraig Jennings2026-06-101-1/+4
|
* chore(todo): log the applyGround diagnosis and file its manual checkCraig Jennings2026-06-101-1/+12
|
* 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.
* chore(todo): archive resolved theme-studio tasks to ResolvedCraig Jennings2026-06-101-113/+108
|