diff options
| -rw-r--r-- | docs/design/module-inventory.org | 66 | ||||
| -rw-r--r-- | modules/ai-config.el | 10 | ||||
| -rw-r--r-- | modules/ai-vterm.el | 12 | ||||
| -rw-r--r-- | modules/browser-config.el | 10 | ||||
| -rw-r--r-- | modules/calendar-sync.el | 16 | ||||
| -rw-r--r-- | modules/calibredb-epub-config.el | 11 | ||||
| -rw-r--r-- | modules/chrono-tools.el | 9 | ||||
| -rw-r--r-- | modules/dirvish-config.el | 11 | ||||
| -rw-r--r-- | modules/dwim-shell-config.el | 9 | ||||
| -rw-r--r-- | modules/erc-config.el | 10 | ||||
| -rw-r--r-- | modules/eshell-config.el | 10 | ||||
| -rw-r--r-- | modules/eww-config.el | 8 | ||||
| -rw-r--r-- | modules/flyspell-and-abbrev.el | 10 | ||||
| -rw-r--r-- | modules/games-config.el | 8 | ||||
| -rw-r--r-- | modules/gloss-config.el | 9 | ||||
| -rw-r--r-- | modules/httpd-config.el | 10 | ||||
| -rw-r--r-- | modules/jumper.el | 10 | ||||
| -rw-r--r-- | modules/latex-config.el | 8 | ||||
| -rw-r--r-- | tests/test-init-module-headers.el | 33 | ||||
| -rw-r--r-- | todo.org | 3 |
20 files changed, 240 insertions, 33 deletions
diff --git a/docs/design/module-inventory.org b/docs/design/module-inventory.org index aa6d3c1f..519839f4 100644 --- a/docs/design/module-inventory.org +++ b/docs/design/module-inventory.org @@ -30,7 +30,8 @@ This inventory is independent from the helper inventory owned by - Batch 5 (Dev entry-points, diff, help, lint, VC, Layer 2): classified. 9 modules. - Batch 6 (Programming modules, Layer 2-4): classified. 10 modules. - Batch 7 (Org modules, Layer 3-4): classified. 13 modules. -- 65 of 102 modules classified. +- Batch 8 (Domain / integration / optional modules, Layer 2-4): classified. 17 modules. +- 82 of 102 modules classified. (elfeed-config deferred — see Pending classification.) - No load-order changes have been made; =init.el= keeps its current eager order. * Legend @@ -180,6 +181,33 @@ and refile idle-timer caches are the side effects the spec tracks separately. | =org-webclipper= | 4 | O/D/P | eager | command | none | org-protocol handler | yes | | =hugo-config= | 3 | D/P | eager | command | user-constants, host-environment | package config | yes | +** Batch 8 — Domain / integration / optional modules (Layer 2-4) + +AI, browser, calendar, ebook, file-manager, shell, IRC, web, games, and other +domain workflows. Almost all are eager only by init order and become command-, +hook-, or mode-loaded. calendar-sync stays eager when its .local.el is present. +flyspell-and-abbrev is the one Core-UX member (text-mode hooks). + +| Module | Layer | Cat | Current | Target | Runtime requires | Top-level side effects | Direct load | +|--------+-------+-----+---------+--------+------------------+------------------------+-------------| +| =ai-config= | 3 | D/P | eager | command | keybindings, system-lib | cj/ai-keymap under cj/custom-keymap | yes | +| =ai-vterm= | 3 | D | eager | command | cl-lib, seq, cj-window-geometry-lib, cj-window-toggle-lib, host-environment | 4 global keys | yes | +| =browser-config= | 3 | D/P | eager | command | cl-lib | 1 global key | yes | +| =calendar-sync= | 3 | D/S | eager (.local.el) | eager (.local.el) | cl-lib, subr-x, system-lib, cj-org-text-lib | calendar keymap (boundp-guarded), guarded timer/network | conditional | +| =calibredb-epub-config= | 4 | O/D/P | eager | command | user-constants, subr-x | add-hook, advice-add, package config | yes | +| =chrono-tools= | 3 | D/P | eager | command | user-constants | package config | yes | +| =dirvish-config= | 3 | D/P | eager | command | user-constants, system-utils, host-environment, system-lib, external-open-lib | 3 add-hook, package config | yes | +| =dwim-shell-config= | 3 | D/P | eager | command | cl-lib | package config | yes | +| =erc-config= | 4 | O/D/P | eager | command | cl-lib, keybindings | ERC keymap under cj/custom-keymap | yes | +| =eshell-config= | 3 | D/P | eager | command | system-utils | add-hook, advice-add, package config | yes | +| =eww-config= | 3 | D/P | eager | command | cl-lib | package config | yes | +| =flyspell-and-abbrev= | 2 | C/P | eager | hook | cl-lib | mode-hook package config | yes | +| =games-config= | 4 | O | eager | command | none | package config | yes | +| =gloss-config= | 4 | O/D/P | eager | command | none | package config | yes | +| =httpd-config= | 4 | O/D/P | eager | command | none | package config | yes | +| =jumper= | 4 | O/L | eager | command | cl-lib | jumper keymap | yes | +| =latex-config= | 3 | D/P | eager | mode | none | package config | yes | + * Hidden dependencies found Discoveries that belong to Phase 2 (make dependencies explicit). Recorded here, @@ -205,33 +233,33 @@ not fixed here. - =flycheck-config= binds =(:map cj/custom-keymap ...)= through use-package but does not require keybindings, so the binding fails when the module loads standalone. Phase 2 fix: require keybindings (or move to the registration API). +- =calendar-sync= guards its =C-; g= registration with =(when (boundp + 'cj/custom-keymap) ...)= and does not require keybindings, so the binding + silently drops standalone. Same boundp-shim pattern. Phase 2/3 fix. + +* Deferred classification + +- =elfeed-config= is read and understood (Layer 4, O/D/P, command-loaded; runtime + requires user-constants, system-lib, media-utils) but its header is not yet + annotated. Annotating triggers the PostToolUse byte-compile, and its tests + (=tests/test-elfeed-config-helpers.el=) only pass when elfeed-config loads as + interpreted source: the byte-compiled =cj/elfeed-process-entries= inlines the + =elfeed-entry-link= struct accessor, so the tests' function stubs are bypassed + and the inlined accessor type-checks a real =elfeed-entry=. The batch test + environment has no elfeed package on the load-path, so the tests cannot build + real structs either. Classifying elfeed-config needs that test rewritten first + (define a stand-in =elfeed-entry= struct, or make elfeed loadable in batch). + Tracked as a todo task. * Pending classification -The remaining 37 modules required by =init.el=, awaiting per-module inspection. +The remaining 20 modules required by =init.el=, awaiting per-module inspection. Each batch reads these against their source and moves them into [[*Classified modules][Classified modules]] with a load-graph header. Suggested batch order follows the spec: text/editing command modules, then UI, then programming, then Org, then optional integrations. -- [ ] ai-config -- [ ] ai-vterm -- [ ] browser-config -- [ ] calendar-sync -- [ ] calibredb-epub-config -- [ ] chrono-tools -- [ ] dirvish-config -- [ ] dwim-shell-config - [ ] elfeed-config -- [ ] erc-config -- [ ] eshell-config -- [ ] eww-config -- [ ] flyspell-and-abbrev -- [ ] games-config -- [ ] gloss-config -- [ ] httpd-config -- [ ] jumper -- [ ] latex-config - [ ] linear-config - [ ] local-repository - [ ] lorem-optimum diff --git a/modules/ai-config.el b/modules/ai-config.el index fad43584..e2a71fed 100644 --- a/modules/ai-config.el +++ b/modules/ai-config.el @@ -2,6 +2,16 @@ ;; author Craig Jennings <c@cjennings.net> ;; ;;; Commentary: +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: registers the cj/ai-keymap (C-; a); GPTel itself should load on +;; command, a Phase 5 deferral candidate. +;; Top-level side effects: defines cj/ai-keymap, registers it under cj/custom-keymap. +;; Runtime requires: keybindings, system-lib. +;; Direct test load: yes (requires keybindings explicitly). +;; ;; Configuration for AI integrations in Emacs, focused on GPTel. ;; ;; Main Features: diff --git a/modules/ai-vterm.el b/modules/ai-vterm.el index 4306db9a..60d0c7f3 100644 --- a/modules/ai-vterm.el +++ b/modules/ai-vterm.el @@ -3,7 +3,17 @@ ;; Author: Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 3 (Domain Workflow). +;; Category: D. +;; Load shape: eager. +;; Eager reason: registers four global keys for the AI-agent vterm launcher; a +;; command-loaded deferral candidate. +;; Top-level side effects: four global key bindings. +;; Runtime requires: cl-lib, seq, cj-window-geometry-lib, cj-window-toggle-lib, +;; host-environment. +;; Direct test load: yes. +;; ;; Picks an AI-agent project (a dir under ~/.emacs.d, ~/code/*, or ;; ~/projects/* containing .ai/protocols.org), opens or reuses a vterm ;; buffer named "agent [<basename>]", sends the agent's startup diff --git a/modules/browser-config.el b/modules/browser-config.el index 52c3b8a6..4a2c5462 100644 --- a/modules/browser-config.el +++ b/modules/browser-config.el @@ -2,6 +2,16 @@ ;; author: Craig Jennings <c@cjennings.net> ;;; Commentary: +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: registers one browser-selection key; a command-loaded deferral +;; candidate. +;; Top-level side effects: one global key binding. +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; This module provides browser selection and configuration for Emacs. ;; It automatically discovers available browsers on the system, allows the user ;; to choose their preferred browser via completing-read, and persists the choice diff --git a/modules/calendar-sync.el b/modules/calendar-sync.el index 4ccb0917..4d1ea219 100644 --- a/modules/calendar-sync.el +++ b/modules/calendar-sync.el @@ -4,7 +4,21 @@ ;; Created: 2025-11-16 ;;; Commentary: - +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/S. +;; Load shape: eager only when calendar-sync.local.el configures calendars. +;; Eager reason: daily-driver workflow; calendars are expected synced at the +;; first session. Timers and network fetches are guarded for batch/test loads. +;; Top-level side effects: defines a calendar keymap and conditionally registers +;; it under cj/custom-keymap; timer and network fetches guarded by +;; config/noninteractive checks. +;; Runtime requires: cl-lib, subr-x, system-lib, cj-org-text-lib. keybindings is +;; needed for the C-; g binding but only reached through a boundp guard, so the +;; binding silently drops standalone. Phase 2 fix. +;; Direct test load: conditional (C-; g registration skipped without keybindings; +;; private config optional). +;; ;; Simple, reliable one-way sync from multiple calendars to Org mode. ;; Downloads .ics files from calendar URLs (Google, Proton, etc.) and ;; converts to Org format. No OAuth, no API complexity, just file conversion. diff --git a/modules/calibredb-epub-config.el b/modules/calibredb-epub-config.el index 45a0b79a..4243e509 100644 --- a/modules/calibredb-epub-config.el +++ b/modules/calibredb-epub-config.el @@ -2,7 +2,16 @@ ;; author Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 4 (Optional). +;; Category: O/D/P. +;; Load shape: eager. +;; Eager reason: none; optional ebook workflow, a command-loaded deferral +;; candidate for Phase 4. +;; Top-level side effects: one add-hook, one advice-add, package config. +;; Runtime requires: user-constants, subr-x. +;; Direct test load: yes. +;; ;; This module provides a comprehensive ebook management and reading experience ;; within Emacs, integrating CalibreDB for library management and Nov for EPUB ;; reading. diff --git a/modules/chrono-tools.el b/modules/chrono-tools.el index 33f2b11e..9ccba667 100644 --- a/modules/chrono-tools.el +++ b/modules/chrono-tools.el @@ -3,6 +3,15 @@ ;; ;;; Commentary: ;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; calendar/timer commands, a command-loaded deferral +;; candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: user-constants. +;; Direct test load: yes. +;; ;; This module centralizes configuration for Emacs time-related tools: ;; ;; – time-zones: interactive world clock with fuzzy search and time shifting diff --git a/modules/dirvish-config.el b/modules/dirvish-config.el index 8fe5c7b8..9e50bbc0 100644 --- a/modules/dirvish-config.el +++ b/modules/dirvish-config.el @@ -2,7 +2,16 @@ ;; author: Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; file manager, a command/hook-loaded deferral candidate. +;; Top-level side effects: three add-hook, package configuration via use-package. +;; Runtime requires: user-constants, system-utils, host-environment, system-lib, +;; external-open-lib. +;; Direct test load: yes. +;; ;; Enhanced file management via Dirvish (modern dired replacement) with icons, ;; previews, and quick access directories (press 'g'). Includes utilities for ;; ediff, playlist creation, path copying, and external file manager integration. diff --git a/modules/dwim-shell-config.el b/modules/dwim-shell-config.el index 046a7e63..83f1d4a2 100644 --- a/modules/dwim-shell-config.el +++ b/modules/dwim-shell-config.el @@ -2,6 +2,15 @@ ;; ;;; Commentary: ;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; Dired/Dirvish shell commands, a command-loaded deferral +;; candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; This module provides a collection of DWIM (Do What I Mean) shell commands ;; for common file operations in Dired and other buffers. It leverages the ;; `dwim-shell-command' package to execute shell commands on marked files diff --git a/modules/erc-config.el b/modules/erc-config.el index 76e7e74e..e63b12eb 100644 --- a/modules/erc-config.el +++ b/modules/erc-config.el @@ -3,6 +3,16 @@ ;; ;;; Commentary: ;; +;; Layer: 4 (Optional). +;; Category: O/D/P. +;; Load shape: eager. +;; Eager reason: none; IRC should not be a startup load, a command-loaded +;; deferral candidate for Phase 5. +;; Top-level side effects: defines an ERC keymap, registers it under +;; cj/custom-keymap, package configuration via use-package. +;; Runtime requires: cl-lib, keybindings. +;; Direct test load: yes (requires keybindings explicitly). +;; ;; Enhanced ERC configuration with multi-server support. ;; ;; Main keybindings: diff --git a/modules/eshell-config.el b/modules/eshell-config.el index 4d180d1c..64bc88c6 100644 --- a/modules/eshell-config.el +++ b/modules/eshell-config.el @@ -2,7 +2,15 @@ ;; author Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; shell/REPL, a command/hook-loaded deferral candidate. +;; Top-level side effects: one add-hook, one advice-add, package config. +;; Runtime requires: system-utils. +;; Direct test load: yes. +;; ;; ESHELL ;; - Eshell is useful as a REPL ;; - Redirect to the kill ring : ls > /dev/kill diff --git a/modules/eww-config.el b/modules/eww-config.el index 16a1f5eb..066fae98 100644 --- a/modules/eww-config.el +++ b/modules/eww-config.el @@ -3,6 +3,14 @@ ;; ;;; Commentary: ;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; web-browsing helpers, a command-loaded deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; This module provides a minimal, privacy-focused browsing experience with: ;; - Simplified navigation keybindings (< and > for back/forward) ;; - Quick URL copying to clipboard diff --git a/modules/flyspell-and-abbrev.el b/modules/flyspell-and-abbrev.el index e732ac46..376a9dc5 100644 --- a/modules/flyspell-and-abbrev.el +++ b/modules/flyspell-and-abbrev.el @@ -2,7 +2,15 @@ ;; author Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 2 (Core UX). +;; Category: C/P. +;; Load shape: eager. +;; Eager reason: text-mode spelling and abbrev hooks; spec target is hook-loaded. +;; Top-level side effects: package configuration via use-package (mode hooks). +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; WORKFLOW: ;; This module provides intelligent spell checking with automatic abbreviation ;; creation to prevent repeated misspellings. diff --git a/modules/games-config.el b/modules/games-config.el index e0c512ef..9aa59816 100644 --- a/modules/games-config.el +++ b/modules/games-config.el @@ -3,6 +3,14 @@ ;; ;;; Commentary: ;; +;; Layer: 4 (Optional). +;; Category: O. +;; Load shape: eager. +;; Eager reason: none; optional games, a command-loaded deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: none. +;; Direct test load: yes. +;; ;; Configuration for game packages. ;; ;; - Malyon for playing interactive fiction and text adventures in Z-machine format diff --git a/modules/gloss-config.el b/modules/gloss-config.el index 63b3c8d2..8afe44d4 100644 --- a/modules/gloss-config.el +++ b/modules/gloss-config.el @@ -3,6 +3,15 @@ ;;; Commentary: ;; +;; Layer: 4 (Optional). +;; Category: O/D/P. +;; Load shape: eager. +;; Eager reason: none; optional glossary workflow (v1 shakedown), a command-loaded +;; deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: none. +;; Direct test load: yes. +;; ;; gloss — Glossary Lookup with Online-Sourced Selection. ;; ;; Personal glossary on `C-h g'. Looks up terms in a single git-tracked diff --git a/modules/httpd-config.el b/modules/httpd-config.el index ac1f7a0f..c9039942 100644 --- a/modules/httpd-config.el +++ b/modules/httpd-config.el @@ -2,7 +2,15 @@ ;; author Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 4 (Optional). +;; Category: O/D/P. +;; Load shape: eager. +;; Eager reason: none; local web server, a command-loaded deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: none. +;; Direct test load: yes. +;; ;;; Code: diff --git a/modules/jumper.el b/modules/jumper.el index 67d930aa..8941d508 100644 --- a/modules/jumper.el +++ b/modules/jumper.el @@ -7,7 +7,15 @@ ;; URL: https://github.com/cjennings/jumper ;;; Commentary: - +;; +;; Layer: 4 (Optional). +;; Category: O/L. +;; Load shape: eager. +;; Eager reason: none; navigation helper, a command-loaded deferral candidate. +;; Top-level side effects: defines a jumper keymap. +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; Jumper provides a simple way to store and jump between locations ;; in your codebase without needing to remember register assignments. ;; diff --git a/modules/latex-config.el b/modules/latex-config.el index a0af2a1a..8636e2cd 100644 --- a/modules/latex-config.el +++ b/modules/latex-config.el @@ -3,6 +3,14 @@ ;;; Commentary: ;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; LaTeX/AUCTeX editing, a hook/mode-loaded deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: none. +;; Direct test load: yes. +;; ;; WORKFLOW: ;; ;; Opening any tex file will put you into LaTeX mode. diff --git a/tests/test-init-module-headers.el b/tests/test-init-module-headers.el index 267a9155..feaf93fd 100644 --- a/tests/test-init-module-headers.el +++ b/tests/test-init-module-headers.el @@ -92,7 +92,25 @@ "org-reveal-config" "org-roam-config" "org-webclipper" - "hugo-config") + "hugo-config" + ;; Batch 8 — Domain / integration / optional modules (Layer 2-4) + "ai-config" + "ai-vterm" + "browser-config" + "calendar-sync" + "calibredb-epub-config" + "chrono-tools" + "dirvish-config" + "dwim-shell-config" + "erc-config" + "eshell-config" + "eww-config" + "flyspell-and-abbrev" + "games-config" + "gloss-config" + "httpd-config" + "jumper" + "latex-config") "Modules annotated with the load-graph header contract. Grows one batch at a time. Parity with the init.el require set is the Phase 1 exit criterion.") @@ -166,11 +184,14 @@ omits the reason." ";; Direct test load: yes.\n"))) (should (member "Eager reason:" (test-init-header--missing-labels header))))) -(ert-deftest test-init-header-scoping-excludes-unclassified () - "Error: an unclassified module is not enforced (scoping proof)." - ;; games-config is required by init.el but not yet classified; it must be - ;; absent from the allowlist so the suite stays green during migration. - (should-not (member "games-config" test-init-header--classified-modules))) +(ert-deftest test-init-header-scoping-only-checks-allowlist () + "Error: only allowlisted modules are enforced, and the list stays clean. +A name never added to the allowlist stands in for any not-yet-classified +module: the validator checks allowlist members only. The duplicate guard +keeps the list honest as it grows batch by batch." + (should-not (member "not-a-classified-module" test-init-header--classified-modules)) + (should (equal (length test-init-header--classified-modules) + (length (delete-dups (copy-sequence test-init-header--classified-modules)))))) (provide 'test-init-module-headers) ;;; test-init-module-headers.el ends here @@ -492,6 +492,9 @@ The =init.el= require for =latex-config= carried a bare "WIP need to fix" commen ** TODO [#C] Decide prog-shell config home :refactor: The =init.el= require for =prog-shell= carried a "combine elsewhere" comment. Retired it during module classification. Decide whether shell-script editing config should fold into =prog-general= or stay its own module, then act or close. +** TODO [#C] Make elfeed-config tests byte-compile-safe :test: +The =cj/elfeed-process-entries= tests in =tests/test-elfeed-config-helpers.el= only pass when =elfeed-config= loads as interpreted source. The byte-compiled function inlines the =elfeed-entry-link= struct accessor, so the function stubs are bypassed and the inlined accessor type-checks a real =elfeed-entry=. The batch test environment has no elfeed package, so the tests can't build real structs either. Rewrite the tests (define a stand-in =elfeed-entry= cl-struct, or make elfeed loadable in batch) so they survive byte-compilation. This blocks annotating elfeed-config with its load-graph header (the last unclassified init module). + ** TODO [#B] Rework dev F-keys: compile+run (F4), test (F6), coverage (F7) :feature: :PROPERTIES: :LAST_REVIEWED: 2026-05-22 |
