| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
Today <cj only expands in org-mode via org-structure-template-alist. A Claude skill scans for the literal #+begin_src cj: comment marker across files, so I need to insert the exact same text in any buffer regardless of major mode.
The new task captures four sub-tasks: wire yasnippet to yas-global-mode + activate fundamental-mode as an extra mode in every buffer, create the snippet at snippets/fundamental-mode/, remove the now-redundant org-tempo entry from modules/org-babel-config.el:144, and a smaller follow-up audit of existing per-mode snippets that should probably live in fundamental-mode/.
|
| |
|
|
|
|
|
|
|
|
| |
The Gptel Work heading was a one-line placeholder. I filled it in with nine sub-tasks after deciding to keep gptel for one-off conversations, impromptu help, and the rewrite-region helper (workflow distinct from the F9 ai-vterm agents, so per-project sessions stay uncluttered).
Bumped the parent to PROJECT [#B] and merged the standalone "Investigate gptel-magit not working properly" task in as a sub-task — the gptel-magit work belongs with the rest of the gptel surface.
Four [#B] work items: wire the existing update_text_file tool into cj/gptel-local-tool-features, fix the three gptel-magit triggers, add ERT coverage for ai-conversations.el (zero today), add ERT coverage for the gptel-tools .el files (also zero).
Five [#C] proposals for review: research and shortlist additional gptel tools, promote gptel-rewrite ergonomics with a directive picker, build a saved-conversations browser, add a one-shot quick-ask command, and ship an autosave toggle + mode-line indicator.
|
| |
|
|
| |
The implementation shipped 2026-04-26 in 781b46e (cj/lsp-file-watch-ignored-extras plus the hook in modules/prog-lsp.el, 10/10 tests green). The manual smoke check in the dashboard MVP and the redundant .dir-locals.el cleanup on velox are tracked separately as active reminders, so todo.org doesn't need to carry the VERIFY state.
|
| |
|
|
|
|
|
|
|
|
|
| |
All five children shipped earlier this month but were left tagged TODO/VERIFY. I verified each against the repo, marked them DONE with their actual closure dates, and closed the PROJECT today.
Children closed:
- Write full utility consolidation design spec — 2026-05-04 (b3ef232a)
- Inventory private helpers across modules — 2026-05-10 (502bcf41)
- Extract executable lookup with warning helper — cj/executable-find-or-warn in system-lib.el (c75e36f4)
- Extract argv-based process runner helper — cj/process-output-or-error and cj/git-output-or-error in system-lib.el (57e558ce)
- Extract Org-safe text sanitizers — cj-org-text-lib.el (0f9e3087)
|
| |
|
|
|
|
|
|
| |
I ran the wrap-up hygiene that the previous session skipped.
`--archive-done` moved 7 DONE subtrees out of Open Work into Resolved. `lint-org` applied 8 mechanical heading-line merges. 12 remaining judgment items (mostly broken file links and one malformed timestamp) went to the lint follow-ups file for later.
I tagged the two top-level review projects `:no-sync:` so their subtrees stop cascading priority bumps — `:refactor:no-sync:` on the architecture review project and `:review:no-sync:` on the module-by-module review project. The latter also dropped from `[#A]` to `[#B]`. It was sitting at A only because the cascade was forcing it. B is where the work belongs now that the opt-out works.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
added modules
Second-pass review of the existing six review tracks (foundation, custom
editing, UI / navigation, Org workflow, programming workflow,
integrations) walked each track as if it had not been reviewed before.
Existing child tasks were deliberately excluded from re-reporting; only
concrete, file-cited, actionable findings not already on the parent
project's task list were filed.
Findings filed:
- Foundation (5): duplicate user-home-dir constant; redundant
eval-when-compile alongside autoload in system-defaults; defcustom
conversions for cj/debug-modules and cj/use-online-repos; surface
the custom-file trash-binning; name package-archive priorities.
- Custom editing (6): region-or-buffer scope inconsistency between
text-enclose and ordering helpers; trailing-newline preservation
in custom-ordering; non-file-buffer guard for
cj/duplicate-line-and-comment; idempotent advice setup in
external-open; comment-delimiter validation in custom-comments;
state-machine coverage for cj/title-case-region.
- UI / navigation (9): popper-mode :init activation defeats
:disabled t; vc-git--symbolic-ref fallback in modeline; theme-aware
face in cj/display-available-fonts; TTY-first frame race in font
setup; per-profile cache in mousetrap-mode keymap rebuilds;
symlink-aware VC modeline cache invalidation; C-s binding shadows
isearch; cursor-color hook guard for non-GUI frames; nerd-icons
advice deferral via with-eval-after-load.
- Org workflow (3): de-duplicate org-protocol handler registration
in org-webclipper; validate :url and :title in
cj/org-protocol-webclip; replace global cj/webclip-current-* with
structured per-invocation state.
- Programming (6): load-time executable-find checks for prettier
and pyright; idempotent server-after-make-frame-hook in
keyboard-compat; dev-fkeys F6 typescript runner clause; prog-lsp
eldoc-provider removal scope; externalize flycheck LanguageTool
script path; externalize latex-config Zathura viewer.
- Integrations (2): markdown-preview httpd-start side effect;
externalize hardcoded SSH hostnames in eshell-config.
Plus: a new "Review newly added modules" sibling task lists all
24 modules that were either added after the parent task was written
(post-2026-04) or fell outside the original review-track scope lists.
Each is routed to its target track; module-specific findings are
filed under the relevant track above.
The integrations track re-review subagent derailed mid-run; rather
than re-issue it, the track's existing 16 child tasks plus the
newly-added-modules findings are deemed adequate coverage. Future
re-review passes can revisit if needed.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Both follow-up sub-TODOs filed earlier today are resolved:
- cj/toggle-gptel cross-module boundary is now an explicit autoload
declaration in ai-vterm.el; make compile is clean and a regression
test in test-ai-vterm--f9-in-vterm.el asserts the contract.
- Info-mode dispatcher in cj/buffer-source-functions now returns the
full org bracket-link form [[info:(manual)Node][(manual) Node]];
the existing .info.gz test asserts the new form and a new boundary
test covers the uncompressed .info path.
Parent tasks return to DONE. Sub-TODOs become dated done headings
recording the actual work done.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Three related housekeeping updates that piled up during the session.
The "Write spec on what's needed for music-config not to depend on
EMMS" task is DONE — spec lives at
docs/design/music-config-without-emms.org. Adds a follow-up TODO to
implement the spec, with the complexity and time estimates and the
acceptance checks the spec already defines.
The module-by-module review project moves from PROJECT to DOING. All
six review tracks (foundation, custom editing utilities, UI and
navigation, Org workflows, programming workflows, integrations and
applications) move to DOING with completion-review notes appended
under each. The notes summarize what was re-checked, what coverage
now exists, and which child tasks are still actionable.
Two new sub-TODOs add focused test coverage:
- "Add UI/navigation runtime smoke coverage" — font-config,
modeline-config, popper-config policy.
- "Add smoke coverage for lightweight programming modules with no
direct tests" — prog-general, prog-lisp, prog-training.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two recent DONE tasks turned out to have follow-up issues worth tracking
explicitly instead of leaving them in the closed pile.
The gptel-toggle work (=M-<f9>= rebind) now triggers a make compile
warning that =cj/toggle-gptel= is not known to be defined when
ai-vterm.el loads. The binding still works in normal startup because
ai-config.el loads later, but the cross-module load-order dependency
should be made explicit via an autoload declaration plus a test that
loads ai-vterm.el without preloading ai-config.el.
The buffer-source extension shipped an Info-mode dispatcher that
copies =info:(manual)Node= rather than the documented org-style
bracket link =[[info:(manual)Node][label]]=. The output is a valid
org link target but not the labeled form a Notes paste would expect.
Both parent tasks move back to DOING with sub-TODOs that name the
remaining work, the file/test to update, and the commands to re-run.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add a tiny source-level architecture suite at
tests/test-architecture-startup-contracts.el with two checks:
- Only keybindings.el may globally own the exact C-; prefix. Catches
accidental cross-module rebinding before it ships.
- Top-level timer scheduling (run-with-timer / run-at-time /
run-with-idle-timer) must be guarded by (unless noninteractive ...)
so requiring a module in batch / test mode does not schedule
startup timers. Timer calls inside defuns are exempt -- the test
only rejects forms that execute their body when the module loads.
Four modules had unguarded top-level timer scheduling and would have
tripped the new test. Wrap their startup hooks/timers in
(unless noninteractive ...):
- modules/org-agenda-config.el: 10s idle cache build
- modules/org-refile-config.el: 5s idle cache build
- modules/quick-video-capture.el: after-init-hook + 2s fallback
- modules/wrap-up.el: emacs-startup-hook bury-buffers delay
The contract being protected is "requiring a module in batch should
not start a clock running." Test failures will now point straight at
the offending file/form.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
=make coverage= used to print a line-weighted percentage that only saw
files SimpleCov instrumented. 104 modules existed on disk but only 49
appeared in =.coverage/simplecov.json=, so the headline number was
flattering: untouched modules counted for nothing.
The summary script now adds two things on top of the existing report:
- A =Not in SimpleCov report= section listing modules present under
=modules/*.el= but absent from the SimpleCov output. Missing-module
detection is exactly direct =modules/*.el=; subdirectories and =.elc=
files are ignored.
- A =Project module coverage= line that is module-weighted across every
direct =modules/*.el= file. Tracked modules contribute their per-file
coverage percentage; missing modules contribute 0%.
The original line-weighted SimpleCov percentage stays as the
=instrumented coverage= number. The new module-weighted score is the
honest project-level reading: missing modules count as 0% without
inventing a fake executable-line denominator for them.
Tests assert the missing-module section, the new percentage, and the
ignore rules for .elc / nested files.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replaces the .ai/ draft (2025-11-14) with a corrected and tightened
version under docs/design/. The earlier draft had stale line numbers
pointing at a modeline-config.el layout that no longer exists,
conflated Option 3's risky-local-variable requirement with Option 4's
inline (:eval ...) approach, and missed the active-window gating
convention used by the rest of the modeline.
The new spec uses concrete line refs against current code, calls out
flycheck-mode-line-color (which the old draft missed), recommends
calling flycheck-mode-line-status-text directly instead of returning
the nested (:eval ...) cons, and gates the segment to active window
for consistency with cj/modeline-vc-branch and cj/modeline-misc-info.
todo.org task points at the new path and drops the broken
docs/flycheck-modeline-customization-spec.org link.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replaces a thin third-party config snippet (one use-package corfu + one
use-package cape, with no migration steps and no prescient piece) with
a full spec covering the current company stack: corfu, cape,
corfu-popupinfo, kind-icon, corfu-prescient.
Maps every current company setting to its corfu equivalent
(idle-delay, prefix-length, tooltip-limit, wrap, require-match,
global-mode exclusions, doc popups, icon kinds, prescient sort).
Walks the per-module fixups -- selection-framework, mail-config,
ledger-config, latex-config, eshell-config, and the three prog-*
mode hooks. Adds a test plan and risks section.
todo.org points at the new doc; the broken :COMPLETE_CONFIG:
property (which referenced the wrong line range in someday-maybe)
is gone.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add two dispatchers to cj/buffer-source-functions so C-; b p yields a
useful link form in two more major modes.
mu4e-view-mode returns "mu4e:msgid:<id>" so the result pastes into org
as a clickable link and matches mu4e's own org-protocol handler.
Falls through to buffer-file-name when point isn't on a real message.
Info-mode returns "info:(manual)node" -- the form org-info-store-link
produces. file-name-base only strips one extension, so a compressed
"emacs.info.gz" comes back as "emacs.info"; trim the trailing ".info"
to get the bare manual name. Falls through when Info hasn't populated
its current-file / current-node vars yet.
Tests cover normal + boundary fallthrough for each new mode.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Modify C-; b p: add a dated subheader under the task with ideas for
extending the buffer-source dispatcher beyond audio files -- three
tiers (high-leverage / occasional / skip) covering eww, elfeed,
mu4e, org-mode-at-heading, dired/dirvish, doc-view, magit-log,
xref/grep, image-mode, archive-mode, plus an implementation sketch
(dispatch alist on major-mode with buffer-file-name fallback) and a
proposed rename to cj/copy-buffer-source-as-kill.
EPUB centering nit: was marked CANCELLED, but the visual-review
outcome was actually fine and the task is correctly closed as done
(not abandoned). Flip CANCELLED -> DONE; CLOSED timestamp stays
since that's when the work-state finalized.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
| |
Five level-2 subtrees moved into the Resolved section:
- Surface org narrowing + sparse-tree under C-; O
- F9 toggle restores single-window layout (older)
- AI-vterm scrollback history replaces agent buffer (older)
- Add ERT coverage for modules below 70%
- Fix Python tree-sitter font-lock query syntax error
Five child priorities bumped to match their parents.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The treesit-query-error redisplay flood diagnosed 2026-04-26 no
longer reproduces. Versions: emacs 30.2-3 (was 30.2-2 at the time
of the investigation, upgraded 2026-05-03), tree-sitter 0.26.8
(unchanged). The upstream Emacs version string is unchanged, but
the Arch package revision bump most likely carries a downstream
patch to treesit.c's predicate translation.
Verified by re-running the documented repro: the exact failing query
from python.el captures cleanly via `treesit-query-capture', and
`font-lock-ensure' on a real .py file under `python-ts-mode' returns
with no `treesit-query-error'. No local override needed.
Mark the todo.org entry DONE, fix the stale `inbox/' path on the
investigation-doc link (file now lives under `docs/'), update the
cross-reference from the grammar-bootstrap task to note this no
longer blocks it, and append a RESOLVED 2026-05-14 footer to the
investigation doc so future-me can see why it got closed.
|
| |
|
|
|
|
|
|
|
|
|
| |
After this session's coverage push (68.8% -> 86.5%), 28 of the 30
child modules listed in the coverage-below-70% task have crossed the
threshold. Mark them DONE with their new percentages, leave the two
genuinely-blocked modules (system-defaults.el at 8.3% and
system-commands.el at 69.4%) as TODO with notes explaining the
instrumentation-gap reason each is stuck.
Also: drop the stray =p= from the parent heading.
|
| | |
|
| |
|
|
|
|
|
|
|
|
| |
The main "d" agenda view grows two new blocks. A VERIFICATION block lists tasks in the VERIFY TODO state, placed just above the day's SCHEDULE. An IN-PROGRESS block lists tasks in the DOING TODO state, placed just under SCHEDULE. The full block order is now: OVERDUE -> HIGH PRIORITY -> VERIFICATION -> SCHEDULE -> IN-PROGRESS -> PRIORITY B.
Scope matches the other blocks (every entry in `org-agenda-files`). Scheduled and deadlined entries are included -- a VERIFY task with a date appears in both VERIFICATION and SCHEDULE, mirroring how HIGH PRIORITY behaves. Habits are skipped via `cj/org-skip-subtree-if-habit`; PROJECT-keyword parents wouldn't match `(todo "VERIFY")` exact-state filters anyway, so no extra skip there.
Two new header defvars (`cj/main-agenda-verify-title`, `cj/main-agenda-doing-title`) for symmetry with the existing four. Both blocks reference the shared `cj/--main-agenda-prefix-format` so a format tweak still lands in one place.
Five new tests in `test-org-agenda-config-skip-functions.el` lock the block order, each new block's header / prefix-format / skip-function, and the include-scheduled-entries contract.
|
| |
|
|
|
|
|
|
|
|
| |
Coverage rerun after this session's test additions: 67.2% -> 68.8% (4716/6853 lines across 73 files).
Four modules crossed the 70% threshold and are marked DONE: browser-config 69.7% -> 81.6%, ui-config 64.5% -> 90.3%, custom-whitespace 64.6% -> 97.6%, jumper 64.6% -> 98.0%.
system-defaults stays open with a note: 8 new tests cover its helpers (`cj/disabled`, the gc-threshold hooks, `unpropertize-kill-ring`, `cj/log-comp-warning`) but the gauge still reads 1/12 because the sandboxed `(load ...)` used to skip startup side effects doesn't register with undercover's instrumentation. Closing it needs either a refactor that lets the module load via plain `(require)` in batch, or a different coverage strategy.
Other numbers refreshed where they shifted (ui-navigation 8.7% -> 54.2% from prior session, org-agenda-config 60.0% -> 67.3% from this session's project-name category work, etc.).
|
| |
|
|
|
|
| |
`org-agenda-custom-commands` inlined ` %i %-15:c%?-15t% s` four times across the "d" command's overdue / high-priority / schedule / priority-B blocks. New `cj/--main-agenda-prefix-format` defvar holds the literal once; every block now references the symbol so a format tweak lands in one place.
Regression test walks the "d" command's blocks and asserts each `org-agenda-prefix-format` cell resolves to the shared symbol -- a block that silently diverges fails the check.
|
| |
|
|
|
|
| |
Verifies docker is installed and the daemon is reachable, then either pulls a public image (when `TELEGA_DOCKER_IMAGE` is set) or announces the in-Emacs build path (`M-x telega-server-build`) for the user to run once. Telegram auth (phone + verification code) is interactive on first `M-x telega` and not scripted here.
Same shape as setup-email.sh: helpers are sourceable for bats, `main` runs only under direct execution. 7 bats tests stub `docker` and `command` so the suite never talks to the real daemon.
|
| |
|
|
|
|
| |
`dashboard-navigator-buttons' grows a Row 3 with a single Telegram entry (using the `nf-fa-telegram' icon, launching `telega'). The dashboard-mode-map gets a single-letter `g' shortcut to match the other launcher keys.
Two follow-up TODOs filed under the parent telegram task: the TDLib docker setup script (so a fresh-clone install can boot telega without a system-wide TDLib build) and a dashboard-icon-balance pass (Row 3 with one entry is asymmetric; decide whether to leave it or reorganize).
|
| |
|
|
|
|
| |
`cj/vterm-tmux-history' previously used `pop-to-buffer', which routed the history view through display-buffer-alist -- in an agent window that often meant a split or a hand-off to another window, costing the agent its frame slot. `switch-to-buffer' instead drops the history into the selected window directly; the existing quit handler already restores the origin in that same window via `set-window-buffer'.
New test asserts the in-place behavior: starting single-window with a vterm origin, invoking the command leaves `(one-window-p)` t with the history buffer in the original slot. The existing render test no longer needs its `pop-to-buffer' stub since `switch-to-buffer' works in batch.
|
| |
|
|
|
|
|
|
| |
When the agent buffer is the only window in the frame, F9 buries it (correct) but the next F9 redisplayed it as a side split instead of restoring the full-frame layout -- the display-saved path always called `display-buffer-in-direction`, which insists on a split.
New `cj/--ai-vterm-last-was-bury` flag tracks which toggle-off path ran. `cj/ai-vterm` sets it to t in the bury branch (one-window-p) and nil in the delete-window branch. `cj/--ai-vterm-display-saved` checks the flag at toggle-on: if t and the frame is still single-window, it replaces the selected window's buffer in place rather than splitting. Either branch consumes the flag so it never stays stale.
5 tests in test-ai-vterm--single-window-toggle.el cover the flag's set/clear paths, the still-one-window guard, and the end-to-end roundtrip.
|
| |
|
|
|
|
| |
Coverage snapshot rerun on 2026-05-13 -- selection-framework.el, keyboard-compat.el, and calibredb-epub-config.el all crossed the 70% threshold and got marked DONE; the remaining child tasks got their current numbers refreshed. The total moved from 65.4% to 67.2%.
Marked the [#A] "replace todo indicators with project name" enhancement DONE -- the agenda-category fix shipped in the prior commit. Also added a [#A] dashboard-icon follow-up on the Telegram task and a [#C] task to rebind org-noter insert-note onto =n=.
|
| | |
|
| |
|
|
|
|
|
|
|
| |
I added two open-work entries:
- F9 toggle should restore single-window layout when AI-vterm was the only
window before toggle-off. Current behavior buries (correct) but
toggle-on splits.
- AI-vterm scrollback history should replace the agent buffer in place,
not split or pop a separate window.
|
| | |
|
| |
|
|
|
|
| |
Untrack .cask/, .localrepo/ (61M), emojis/ (7.2M), inbox/, todo.org,
v2mom.org, .time-zones.el. Move test-reporter-spec.org to docs/ (already
gitignored). Reduces tracked repo size significantly.
|
| |
|
|
|
|
|
|
|
|
| |
- Replace use-package gptel-magit hook with autoloads via
with-eval-after-load 'magit (loads gptel only on key press)
- Move org header defuns above use-package to fix load order
- Set gptel-include-reasoning to "*AI-Reasoning*" buffer
- Rebind rewrite to C-; a r, clear context to C-; a c
- Add test-ai-config-gptel-magit-lazy-loading.el (8 tests)
- Mark all ai-config cleanup items DONE in todo.org
|
| |
|
|
|
|
|
|
|
| |
- Move cj/gptel--fresh-org-prefix, cj/gptel--refresh-org-prefix,
cj/gptel-backend-and-model, cj/gptel-insert-model-heading out of
use-package :config to top level (fixes byte-compile warnings)
- Set gptel-include-reasoning to "*AI-Reasoning*" buffer
- Rebind rewrite to C-; a r, clear context to C-; a c
- Update todo.org with completed cleanup items
|
| |
|
|
|
|
|
|
| |
- Escape single quote in cj/ensure-gptel-backends docstring
- Wrap cj/gptel--available-backends docstring to 80 chars
- Add missing docstring to cj/gptel--model-to-string
- Rename cj/gptel--model->string to cj/gptel--model-to-string
- Mark stale model list task as DONE in todo.org
|
| |
|
|
|
|
|
|
| |
Update Anthropic model list to current: claude-opus-4-6, claude-sonnet-4-6,
claude-haiku-4-5-20251001. Fix gptel--system-message not picking up the
custom default.org directive (defvar set at load time before gptel-prompts
replaces the default entry). Add cleanup tasks for ai-config, calibredb,
and slack reaction workflow to todo.org.
|
| |
|
|
|
|
| |
Notifications silently failed: slack-room-im-p (nonexistent) replaced
with slack-im-p; slack-message-to-string replaced with slack-message-body.
Mark-as-read bound to nonexistent function; added cj/slack-mark-read-and-bury.
|
| |
|
|
|
| |
Update load-path, GitHub URL, and all project/package name
references to reflect the chime.el → Chime rename.
|
| |
|
|
|
| |
restclient.el + restclient-jq integration with SkyFi API templates,
tutorial file, auto key injection from authinfo, 17 ERT tests.
|