| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
Close the modified-arrow copy-mode, face-diagnostic buttons, and latexmk activation tasks, and file their residual hands-on checks as VERIFYs under Manual testing and validation.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Two breaks kept latexmk from ever engaging. The :hook key TeX-mode-hook expanded to the unbound TeX-mode-hook-hook, since use-package appends -hook to any symbol not ending in -mode, so TeX-command-default was never set; name the mode TeX-mode instead. Separately auctex-latexmk was :defer t with no trigger, so auctex-latexmk-setup never ran and latexmk never joined TeX-command-list; load it :after tex.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
Render each real face name in the Face Diagnosis report as a button that runs describe-face on it, carrying the face as button data; anonymous specs and non-faces stay plain text. Also add face-diagnostic to the module-header allowlist now that it is required in init.el and carries the header contract.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
|
|
| |
C-<arrow> and M-<arrow> in a ghostel buffer now enter copy-mode and move one step in that direction in a single stroke. The tmux path writes the arrow escape sequence into the pty so the copy cursor follows it; without tmux the same keys enter ghostel-copy-mode and move point. All eight keys join ghostel-keymap-exceptions and the semi-char map is rebuilt, so they reach Emacs instead of the terminal program.
Claude-Session: https://claude.ai/code/session_01BqrdWUo9GcznYX2pZr76gZ
|
| |
|
|
| |
theme-studio coverage, google-keep)
|
| |
|
|
| |
Round-3 Codex review flagged one blocker: summary/readiness/risk text still described the superseded contracts (native color capture, build-inventory.el, dual dir-row sources). Reconciled the Scope tiers, For-the-implementer summary, legend source paragraph, three readiness dimensions, and the Risks section to match the resolved decisions. No decision changed, only the lagging prose. Findings 10/10, decisions 6/6, Ready pending go.
|
| |
|
|
| |
Folded the six round-2 Codex blockers into the spec. Added the explicit 13-row v1 legend table and the missing-key rule. Settled dir-color precedence (the dir advice prepends nerd-icons-yellow, so it wins) and cross-package ownership (the bespoke pane owns only nerd-icons faces; nerd-icons-completion-dir-face stays in its own app). Named the concrete legend artifact and its failure behavior, reordered into an atomic assign-then-drop-tint phase, and added a contract-by-contract test plan. Findings 9/9, decisions 6/6. Ready pending go.
|
| |
|
|
| |
Flipped the legend-rendering decision: v1 draws the actual nerd-font glyph in its assigned color rather than a swatch + label. The deferral rested on an unverified font dependency; Nerd Fonts are installed system-wide, so Chrome renders the glyphs from a font-family rule with no @font-face or font file. Monospace fallback for absent fonts; the gate asserts the glyph char and inline color.
|
| |
|
|
| |
Folded the three blocking Codex findings into the spec. Added the legend data contract (row schema, per-category sources, v1 scope). Corrected the native-color seed to ride the existing default-face pipeline rather than a new build-inventory.el capture that would double-seed. Resolved all six decisions. Spec is Ready pending Craig's go.
|
| |
|
|
| |
Drafts the spec to drop the runtime nerd-icons tint (so icon color is theme-driven) and add a theme-studio filetype-legend representation over the 34 nerd-icons-* color faces. Five decisions left open for review: color model, legend scope, seed source, config sequencing, and the dir advice. Filed the cross-linked task in todo.org.
|
| | |
|
| |
|
|
| |
Map the cj: src-block language to org-mode via org-src-lang-modes, so the prose inside a cj comment block (#+begin_src cj: comment ...) gets org font-lock in place and C-c ' opens an org-mode buffer to edit it. The block stays a src block, so the cj: grep marker and the cj-processing pipeline are unchanged.
|
| | |
|
| |
|
|
|
|
|
|
| |
I moved the ai-term family off the F9 keys onto the C-; a prefix, vacated when gptel was archived: a toggles the agent, s opens the project picker, n swaps to the next agent, k closes one. The frequent swap also gets M-SPC as a fast chord, bound in ghostel-mode-map and added to the semi-char exceptions so it reaches Emacs from inside an agent buffer.
cj/ai-term-next now opens the project picker when no agent is running instead of erroring, so the swap key doubles as a "start an agent" key.
To free M-SPC, I removed jumper's M-SPC binding. Jumper's commands stay reachable via M-x, with a cleverer home pending review.
|
| |
|
|
| |
Routed the four emacs-prefixed items from the shared roam inbox: filed three new tasks (ai-term keybinding home, completion-icon face, org formatting inside cj comments) and folded the control-arrow tmux copy-mode capture into the existing M-arrow copy-mode task.
|
| |
|
|
| |
After archiving gptel, I moved its feature backlog (renamed to "GPTel orphan tasks and useful ideas") and the gptel-dependent Org-native API workspace design out of Open Work into Someday/Maybe, each with a note on what happened and why they're kept. Most of the child tool ideas are agent-tool concepts that would transfer to the ai-term agents or an MCP layer, so they're reference rather than active work.
|
| |
|
|
|
|
|
|
|
|
| |
I archived gptel to archive/gptel/ since I rarely use it. Moved there: the six gptel modules (ai-config, ai-conversations, ai-conversations-browser, ai-mcp, ai-quick-ask, ai-rewrite), the gptel-tools/ directory, custom/gptel-prompts.el, their test files and utilities, and the four gptel-only specs.
Scrubbed from the live config: the ai-config require in init.el, which also drops the whole C-; a keymap; the gptel-mode emojify hook in font-config.el; the gptel-tools entries in the Makefile clean target and the coverage runner; and the gptel feature notes in README. Cancelled the open gptel tasks in todo.org (the AI Open Work issues, the feature-extension brainstorm, the velox gptel-magit bug).
ai-term stays. It is the ghostel Claude launcher, independent of gptel.
Verified: every module loads, a batch init launch reaches completion clean, and the full test suite shows only pre-existing coverage failures unrelated to this change.
|
| | |
|
| | |
|
| |
|
|
| |
A single inventory-composed "minibuffer completion" preview entry: a vanilla baseline always shown, a container radio plus modifier checkboxes selecting the completion stack, a two-family model (default/Vertico vs Ivy). Discoverability rides the preview-locate feature it depends on. Draft only, not yet ready to build: open implementation-readiness blockers remain.
|
| |
|
|
|
|
|
|
| |
Hovering a data-face preview element shows its section, face, and effective value in the preview-label info line, and the element's title carries the full record: effective fg/bg plus a per-attribute source note (direct, inherited-from-X, default, or cleared-rendering-as-default). Clicking an on-pane element scrolls to and flashes its assignment row. Off-pane and cross-surface elements stay hover-only.
A single owner-qualified registry keyed by {owner, face} backs both data-face surfaces, package and UI, so the same face name under two owners never collides. The pure helpers in app-core.js take all state as arguments and return data. The one stateful adapter, previewSpan, lives in previews.js and emits the escaped markup. os() stays a package-owner wrapper over previewSpan, and a unified locateClick dispatcher replaces the per-surface click branches.
Covered by test-locate.mjs and four new browser gates. Full harness green.
|
| | |
|
| |
|
|
| |
Three defects in the saved-location store: removal shifted the slot vector but never freed the dropped register, and a later store allocated by next-index — a char a surviving slot still held — so it silently overwrote that slot's marker. jumper--with-marker-at also guarded only markerp, so a location whose buffer was killed made store and jump signal wrong-type errors. And the single-location toggle never returned: its already-there branch did nothing. Store now takes the first unused register char in the live slice, removal clears the freed register so its marker stops pinning the buffer, the marker guard checks buffer liveness so dead entries are skipped, and the toggle jumps to the last-location register when one is set.
|
| | |
|
| |
|
|
| |
simplecov reports absolute source paths while git diff emits repo-relative ones, so cj/--coverage-intersect joined them by exact key and matched nothing — every changed file read ":tracked nil" under the working-tree, staged, and branch scopes (whole-project worked only because both sides came from the same simplecov source). A new cj/--coverage-relativize-keys normalizes both tables to repo-relative in cj/--coverage-read-and-display before the intersect; the intersect stays pure. Covered by 5 unit tests plus an integration test that drives the real parsers with an absolute-key report and a relative-key diff.
|
| | |
|
| | |
|
| |
|
|
| |
A single-instance Dirvish popup frame (named "dirvish") for a Hyprland Super+F launcher, mirroring the org-capture popup. q closes the frame; in the popup, RET opens files through the OS handler so they launch independently, and the frame dismisses itself on focus loss. A second launch reuses the open popup instead of spawning another frame.
|
| | |
|
| |
|
|
| |
vterm-to-ghostel)
|
| | |
|
| |
|
|
| |
A reference for the native-comp + subr-mocking trap: the mechanism, the three failure modes, the research with URLs, and the decision (variadic mocks + a meta-test now, migrate off primitive-mocking long-term). Refines the CLAUDE.md codified insight, whose old 'don't mock subrs' framing was too broad, and points it at the new doc.
|
| |
|
|
|
|
|
|
| |
Re-enabling native-comp surfaced a suite-wide fragility. When a test redefines a C primitive (or a native-compiled function), native-comp routes native callers through a trampoline that calls the mock with the primitive's maximum arity. A fixed-arity mock narrower than the primitive then throws wrong-number-of-arguments, intermittently, as the eln-cache fills.
I swept every arity-narrow subr mock to append &rest _ (188 sites, preserving any named args the body uses), and added tests/test-meta-subr-mock-arity.el, which fails make test on any subr mock too narrow for the primitive's arity. The rule isn't "never mock a subr". The suite mocks message and completing-read freely. It's "a subr mock must accept the primitive's arity."
Background, the three failure modes, and the research are in docs/native-comp-subr-mocking.org.
|
| |
|
|
|
|
|
|
| |
The previous deferral (03d8b587) autoloaded malyon to games-config, but games-config doesn't define malyon. It leaves the command to the malyon package, so M-x malyon loaded games-config, found malyon still undefined, and errored "Autoloading games-config.el failed to define function malyon". Emacs won't chain through a second autoload.
malyon and 2048-game autoload their own commands via package.el, so games-config should never own them. init.el now loads games-config via (with-eval-after-load 'malyon ...), and games-config just sets malyon-stories-directory when malyon loads. M-x malyon loads the package as a real command, then games-config applies its config.
The earlier batch check loaded the files by hand and missed the autoload failure. The new test resolves the autoload the way M-x does (autoload-do-load), so the real path is covered now.
|
| | |
|
| |
|
|
|
|
| |
init.el eagerly required games-config at startup just to configure two on-demand game packages. package.el already autoloads malyon and 2048-game, so the eager require bought nothing but the one setting the module adds (malyon-stories-directory).
init.el now autoloads malyon and 2048-game to games-config instead of requiring it. The first game command loads the module, which configures then loads the package. Startup no longer touches games-config, and both the commands and the stories-directory setting still work. This is the first module of the Phase 4 low-risk batch.
|
| | |
|
| |
|
|
|
|
| |
erc-yank turned a paste over 5 lines in an ERC buffer into a public gist: it called gist -P (the clipboard paste flag) with no --private, behind only a single y-or-n-p and with no guard if the gist binary was missing. One reflexive keystroke published whatever sat on the system clipboard. It also gisted the clipboard rather than the kill-ring text being yanked.
I dropped the package. erc-mode-map binds no C-y of its own, so C-y now falls through to the ordinary global yank and a paste stays local. Gist a large snippet by hand when that's actually wanted.
|
| | |
|
| |
|
|
|
|
|
|
| |
early-init.el disabled JIT native compilation with (setq native-comp-deferred-compilation nil), the obsolete alias of native-comp-jit-compilation. Despite the comment, setting it nil turns JIT off entirely rather than making it synchronous. Most modules then ran interpreted for the daemon's lifetime, and the native-comp-speed/jobs settings in system-defaults.el were dead. The "Selecting deleted buffer" async race that prompted the disable was an Emacs 28/29 issue. This is 30.2. I re-enabled it with native-comp-jit-compilation t and silent async warnings.
GC was pinned at the stock 800KB: early-init restored it post-startup and the minibuffer setup/exit hooks bounced back to it. That's Emacs's bare-editor default, far too low for 184 packages, so GC pauses fired often during completion, agenda, and LSP/AI work. I replaced both hand-rolled mechanisms with gcmh, which keeps the threshold at 1GB during activity and collects on idle.
Verified a clean full launch in a throwaway daemon (JIT on, gcmh active, no backtrace) and gcmh's threshold cycle in batch.
|
| |
|
|
| |
The s-F9 commit moved server-shutdown off C-<f10> to C-x C and dropped C-<f10> from the ghostel keymap-exceptions. The regression test still asserted C-<f10> was present, so the full suite went red. I updated it to assert <f10> (music) stays an exception and C-<f10> is now absent, since C-x C deliberately forwards to the terminal program inside an agent buffer.
|
| |
|
|
|
|
|
|
| |
A resolved VERIFY at level 2 was rewritten to a dated org header (** 2026-... <desc>), following the old "VERIFY dates at all depths" rule. Dated headers at level 2 fall through every tool that keys on the keyword: --archive-done never moves them, task-review never selects them, and they pile up in Open Work.
The rule is now depth-split, matching ordinary tasks. VERIFY dates only at level 3 and deeper. At level 2 it closes with a DONE/CANCELLED keyword plus a CLOSED line, the answer in the body.
I fixed the two existing violations (the Dirvish d/D and C-; b pull-away VERIFYs, reverted from dated ** headers to ** DONE), and closed the two F9 GUI manual-test VERIFYs after confirming them.
|
| |
|
|
|
|
| |
s-F9 (cj/ai-term-next) steps through the open agent buffers in name order. It's the "switch among existing agents" surface F9's toggle never provided. The cycle logic lives in a pure helper (cj/--ai-term-next-agent-buffer) with Normal/Boundary/Error coverage. The command is a thin window-mutating wrapper.
I dropped the C-S-F9 close alias, leaving M-F9 as the sole close binding. I moved cj/server-shutdown off C-<f10> to C-x C so the key keeps forwarding to the terminal program inside an agent buffer. I also removed the now-unused F10 entries from term-config's ghostel exceptions.
|
| |
|
|
|
|
|
|
|
| |
program
- erc-yank public-gist privacy trap regraded [#B] → [#A], tagged :quick:solo:
- merged the unified-popup-policy and messenger-unification tasks into one [#A] task
- refactoring program marked DONE (item-8 plan() factory consciously skipped)
- stamped LAST_REVIEWED on the reviewed tasks
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
withSavedState
Seven gates (locktest, mocktest, gallerytest, safetest, ndtest, viewlocktest,
expandpersisttest) mutated PALETTE/MAP/SYNTAX/UIMAP/PKGMAP/LOCKED and restored
nothing, so opening the studio at one of those #hashes left its state corrupted
for interactive use. Wrap each in withSavedState(keys, body), scoped to the keys
that gate touches: snapshot the named globals, run the body, restore in a finally.
Uses a JSON-round-trip clone (the studio objects carry values structuredClone
throws on — the same clone the gates' own local saves use). The 14 gates that
already restore locally are left as-is. Verified: all 44 gates green, the restore
round-trip holds for reassignment + in-place + Set mutation, and a forced
assertion in a wrapped gate still reports FAIL.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The 38 standard gates each repeated the same ok flag, notes list, A(cond,note)
collector, and verdict postamble (title + result div), with the note separator
drifted across them (' | ' vs ' fails='). gate(id, body) owns all of it and
standardizes the note format to ' fails=note1,note2'; the gate name is the hash
uppercased, the div id is the hash, matching what each gate set by hand. Each
call site keeps its literal location.hash==='#NAMEtest' (run-tests.sh greps that
to discover gates). Six custom gates (selftest, cursortest, planetest, oklchtest,
readouttest, savetest) stay inline. Verified: all 44 gates green, and a forced
A(false) in a converted gate still reports FAIL (gate() can't manufacture greens).
|
| |
|
|
| |
harness rewrite
|
| |
|
|
|
|
|
|
|
|
|
| |
The #mdtest, #mupreviewtest, and #gnustest browser gates each copy-pasted the
same preview-face validation: render the preview, assert it exercises enough
data-faces, that every data-face is real for the package, and that the required
faces are present. Lift that into one assertPreviewFaces(A, html, faces, min,
name, required) helper. Each gate keeps its literal location.hash==='#NAMEtest'
check (run-tests.sh greps that to discover gates) and its own title/result-div.
Verified: all 44 gates green, and a deliberately-broken required face still makes
its gate report FAIL (the helper can't manufacture greens).
|