summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/design/module-inventory.org66
-rw-r--r--modules/ai-config.el10
-rw-r--r--modules/ai-vterm.el12
-rw-r--r--modules/browser-config.el10
-rw-r--r--modules/calendar-sync.el16
-rw-r--r--modules/calibredb-epub-config.el11
-rw-r--r--modules/chrono-tools.el9
-rw-r--r--modules/dirvish-config.el11
-rw-r--r--modules/dwim-shell-config.el9
-rw-r--r--modules/erc-config.el10
-rw-r--r--modules/eshell-config.el10
-rw-r--r--modules/eww-config.el8
-rw-r--r--modules/flyspell-and-abbrev.el10
-rw-r--r--modules/games-config.el8
-rw-r--r--modules/gloss-config.el9
-rw-r--r--modules/httpd-config.el10
-rw-r--r--modules/jumper.el10
-rw-r--r--modules/latex-config.el8
-rw-r--r--tests/test-init-module-headers.el33
-rw-r--r--todo.org3
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
diff --git a/todo.org b/todo.org
index 5e6fd0f3..d3d6cb94 100644
--- a/todo.org
+++ b/todo.org
@@ -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