aboutsummaryrefslogtreecommitdiff
path: root/init.el
Commit message (Collapse)AuthorAgeFilesLines
* feat(term): replace vterm with ghostel as the terminal engineCraig Jennings10 hours1-2/+2
| | | | | | | | I swapped the terminal engine from vterm to ghostel (libghostty-vt) everywhere. term-config replaces vterm-config (the F12 terminal, the C-; x menu, tmux history capture), and ai-term replaces ai-vterm (the F9 Claude-agent launcher). ghostel renders the agent TUI without vterm's flicker under heavy streaming, and one engine now covers every terminal workflow. Two behavior changes fall out of the swap. F9 launches in a terminal frame now: ghostel renders in TTY frames, so the old GUI-only guard is gone. Terminal windows no longer dim when unfocused: ghostel resolves its palette into the native module per-terminal, so there's no per-window color hook to dim through the way vterm had. auto-dim drops its vterm color-advice path, the dashboard Terminal button launches ghostel, and the vterm and vterm-toggle packages are removed. The tmux pane-history and copy-mode machinery carried over unchanged. It keys on the pty tty, which ghostel exposes.
* feat(signal): add Signal client foundation on a signel forkCraig Jennings10 days1-0/+1
| | | | | | | | | | I'm building a Signal client in Emacs on signal-cli (linked as a secondary device) with a fork of the signel package as the front end. signel is on MELPA but effectively abandoned, and the behavior I want needs internal edits, so owning a fork beats advising a dead package. Full rationale and the rejected alternatives are in docs/design/signal-client.org. This lands the signal-cli-independent foundation: contact-list parsing for a completing-read picker, and the predicate that suppresses a notification for the chat being actively viewed. Both are pure and unit-tested without a linked account. cj/signal--parse-contacts was corrected against a live account (signal-cli 0.14 puts givenName/familyName at the top level, not under profile), and verified across all 94 real contacts. The use-package wiring loads the fork from ~/code/signel, sources the account from a gitignored signal-config.local.el (a phone number is an identifier, not a credential, and this keeps it off the mirror without a GPG prompt), and turns off auto-open so an incoming message can't steal a window. Verified live: signel-start spawns the jsonRpc process, loads the account, and receives over the channel. The fork edits (notify routing, the upstream input-clobber bug) and the contact-picker command are still to come.
* chore(init): drop the disabled popper-config moduleCraig Jennings10 days1-1/+0
| | | | popper-config was use-package :disabled t, so use-package elided the whole form and none of it ran. It was a no-op sitting in the load graph, required only from init.el. I removed the module and its require. No behavior change. validate-modules passes and init still loads clean. The config stays in git history if popper is ever wanted again.
* refactor(user-constants): move filesystem creation out of module loadCraig Jennings11 days1-0/+2
| | | | | | | | (require 'user-constants) created ~8 directories and ~10 org/calendar files at load time, via a top-level dolist for the calendar stubs and a top-level call to cj/initialize-user-directories-and-files. That meant any bare require — tests, byte-compile, batch tools — wrote to disk. It's why a stray sync/org/ tree kept appearing in the repo during test runs. I removed both top-level forms and folded the gcal/pcal/dcal creation into the initializer. The path defconsts stay exactly as they were, so every consumer that just reads a path is unaffected. init.el now calls the initializer right after requiring the module, guarded by (unless noninteractive), so interactive and daemon startup create everything in the same order as before while a bare require stays side-effect-free. Added tests/test-user-constants.el: loading the module creates nothing, and the initializer creates the backbone dirs and the configured files. Updated the module header — top-level side effects are now none and it's safe to load in tests.
* feat(auto-dim): dim non-selected windows via auto-dim-other-buffersCraig Jennings11 days1-0/+1
| | | | | | | | I added auto-dim-config, a module that loads my local auto-dim-other-buffers fork and dims windows that don't have focus so the selected window stands out. A non-selected window drops to a pure-black background with faded gray text. The dimmed faces live in the dupre theme (themes/dupre-faces.el) so they track theme switches, and the module remaps default, the font-lock faces, and org-block onto them so syntax-highlighted code fades too rather than staying lit. Fringe is left out because dimming it forces a full-frame refresh that flickers on this non-pgtk build. dim-on-focus-out is nil, so tabbing to a browser or terminal on Hyprland doesn't dim the whole frame. vterm and agent windows don't dim either, because the terminal paints its own per-cell colors past the face remap. I'm keeping that, since the agent's output stays readable while I work in code on the other side. The module loads after the theme, carries a load-graph header, joins the header-contract allowlist, and the inventory moves to 103 of 103 classified.
* docs(init): retire stale module comments and track follow-upsCraig Jennings12 days1-3/+3
| | | | Three init.el requires carried vague comments: latex-config "WIP need to fix", prog-shell "combine elsewhere", and a "Modules In Test" banner. I replaced them with descriptive comments and moved the real follow-up work into todo.org tasks: investigate the latex-config state, and decide whether prog-shell config folds into prog-general. I also marked the module-classification task DOING.
* feat(linear): re-enable linear-config and wire the reworked command surfaceCraig Jennings13 days1-2/+1
| | | | | | | | linear-emacs grew a lot of new commands in its rework: filtered lists, saved queries, Custom Views, open-in-browser, comments, delete, and set-assignee/state/priority/labels on the issue at point. The config still listed and bound only the original seven, and the init.el require was commented out while the package was in flux. I re-enabled the require, expanded :commands to all 25 autoloaded commands, and rebuilt the C-; L keymap around them: lists and views up top, an o/r/D set for the issue at point, sync on s/S/u/U, and a C-; L e sub-prefix for editing the issue's fields. The lazy authinfo key-load advice and the data/linear.org path carry over unchanged. I verified the dependency symbols still exist before wiring, but the live connection check (C-; L ?) is still yours to run.
* fix(linear): load API key for check-setup and pin org file to emacs homeCraig Jennings13 days1-1/+2
| | | | | | | | linear-emacs-check-setup read linear-emacs-api-key directly and bailed to "API key is not set" before making any request, so the lazy :before advice on the GraphQL request never fired for it. A fresh session always reported the key missing even though it was in authinfo. I extracted cj/linear--install-key-advice and put the loader on check-setup as well as the request entry point, with a regression test. I also pinned linear-emacs-org-file-path to data/linear.org inside emacs home, next to the calendar-sync output. Left to its default it falls back to org-directory/gtd/linear.org and silently created a stray ~/org tree on the first pull. The init.el require is commented out for now while linear-emacs is reworked. The config will need rework once that lands.
* feat(linear): wire linear-emacs into the config for DeepSatCraig Jennings13 days1-0/+1
| | | | | | I added modules/linear-config.el to load the local linear-emacs checkout (the same :load-path + :ensure nil shape gptel and org-drill use) and point it at DeepSat's Linear workspace. The personal API key comes from authinfo.gpg, loaded lazily by a named :before advice on the request function, so there's no GPG prompt at startup. The default team is DeepSat's Software Engineering team, and the commands sit under a C-; L prefix. Verified live against DeepSat: the connection authenticates, lists all five workspace teams, and pulls real issues (SE-*, DEE-*). Tests cover the key-loader (loads when unset, keeps an existing key, stays nil when absent) and the keymap wiring.
* feat(telega): add telega.el module with docker-backed TDLibCraig Jennings2026-05-131-0/+1
| | | | | | | | New `modules/telega-config.el` configures telega.el as an in-Emacs Telegram client. `telega-use-docker' is on so TDLib runs in a container instead of needing a system-level build -- pairs with a follow-up `scripts/setup-telega.sh' for fresh-clone installs. First-run auth (phone + verification code) is interactive inside `M-x telega' and isn't scripted here. Launcher binding: `C-; G` (mnemonic: teleGram). `C-; t` and `C-; m t` were both taken (test-runner, music's "repeat track"), so the launcher landed on a free top-level letter. Two tests cover the wiring: module loads, launcher is bound.
* refactor: split eshell-vterm-config into eshell-config and vterm-configCraig Jennings2026-05-101-1/+2
| | | | | | The combined module had grown to 573 lines covering two unrelated subsystems with no shared state — the eshell shell-mode commands and the vterm/F12 toggle. The header even rendered this with two `;; ----` dividers. Split into two focused modules. eshell-config.el keeps the eshell user commands and package wiring (~170 lines). vterm-config.el keeps the vterm package, the tmux history capture command, the F12 toggle, and the C-; V keymap (~400 lines). Update init.el to require both, point the four vterm test files at vterm-config, and refresh the cross-module commentary in cj-window-geometry.el and cj-window-toggle.el. No behavior change. Full test suite green; validate-modules clean.
* Move GPTel tool loading into AI configCraig Jennings2026-05-101-11/+0
| | | | Move the local GPTel tool wiring out of init.el and into ai-config. The tools directory and feature list are now configurable, missing optional tools are non-fatal, and focused tests cover the loading behavior.
* feat(ai-vterm): add Claude launcher with vertical-split vtermCraig Jennings2026-05-071-0/+1
| | | | | | | | The new module picks a Claude-template project from a filtered completing-read list. It scans the same roots the `ai` shell launcher uses, then opens or reuses a vterm buffer named `claude [<repo>]` on the right. F9 launches it. The prior `cj/toggle-gptel` binding moves from F9 to C-F9 so both AI tools share the same physical key. The display rule chains reuse-window -> use-some-window -> in-direction (right). The resulting window isn't dedicated. That matters because side-window dedication was breaking `buffer-move` (C-M-arrows) and `switch-to-buffer` replacement on the claude buffer. I also narrowed `vterm-toggle`'s display rule to skip `claude [` buffers. Otherwise it claimed them first with its bottom-split + dedicated treatment. I added 23 tests across 5 files: the buffer-name transform, candidate walker, show-or-create dispatch, picker, and display rule. Design lives at docs/design/ai-vterm.org.
* fix: restore daemon icons and consolidate nerd-icons setupCraig Jennings2026-05-071-0/+1
| | | | | | | | | | I replaced the load-time icon-stub block in keyboard-compat with per-call :around advice that checks display-graphic-p against the rendering frame. The old block ran at module-load. Under daemon startup no frame exists yet, so display-graphic-p returned nil and the empty-string stubs installed permanently. Every GUI client connecting to that daemon then saw blanks. The new shape lets one daemon serve real icons to GUI clients and blanks to terminal clients. I also pulled the nerd-icons-completion and nerd-icons-ibuffer integrations, the package install, and a new tint helper into modules/nerd-icons-config.el. Per-feature use stays in the consuming module (dashboard, dirvish, keyboard-compat). The malformed cons-cell on the marginalia hook in selection-framework.el got fixed in the move. Added a default darkgoldenrod tint, a :filter-return advice on nerd-icons-icon-for-dir so dir icons pick up a color face, and a buffer-local face-remap in dired-mode-hook so plain files in dired render in shadow grey. 13 tests across 3 new files cover the per-call gate, the dir-color helper (idempotent under nerd-icons' memoized return strings), and the bulk-tint helper.
* refactor: move and test theme persistence behaviorCraig Jennings2026-05-031-0/+1
|
* feat(dev-fkeys): add project-aware F4 compile/run dispatcherCraig Jennings2026-05-031-0/+1
| | | | | | | | | | | | | | | | | | | I added a new module `modules/dev-fkeys.el` that owns the dev F-key block. F4 prompts via `completing-read` with a candidate set filtered by project type (compiled / interpreted / unknown). C-F4 is the compile-only fast path. M-F4 is clean + rebuild. It runs a heuristic clean command derived from the project markers (go.mod, Cargo.toml, Eask, Makefile, CMakeLists.txt) and chains `projectile-compile-project` on success. S-F4 stays on `recompile` and now lives globally instead of duplicated across prog-general.el and prog-c.el. F6 is bound globally to `projectile-test-project` as a Phase 1 stopgap. Phase 2 replaces it with the polyglot test runner spec'd in todo.org. Project-type detection runs against the projectile root and falls back to `unknown` when no marker matches. Interpreted markers are checked first so a Python or Node project with a Makefile for tasks classifies as interpreted instead of compiled. Compile + Run sequencing uses a one-shot `compilation-finish-functions` hook that self-removes on first invocation and only fires the follow-up when the status string starts with `finished`. Cleanup in the same commit: - Dropped F4/F5/F6 from `prog-general.el`'s prog-mode-hook. They are now global. - Dropped F6→format bindings from prog-c.el / prog-python.el / prog-shell.el. C-; f was already bound in each, so this is pure removal. - Dropped the duplicate S-F4 from prog-c.el. The global binding covers it. - Updated the keybinding header in prog-general.el and the workflow comments in prog-c.el / prog-shell.el. - Wired `(require 'dev-fkeys)` in init.el alongside coverage-core. TDD: 73 tests across 11 files, one per helper. Production code is split into small testable internals (`cj/--detect-project-type`, `cj/--f4-candidates`, `cj/--f4-derive-clean-cmd`, `cj/--f4-make-once-hook`, `cj/--f4-dispatch`, `cj/--f4-compile-and-run-impl`, `cj/--f4-clean-rebuild-impl`, `cj/--f4-project-root`) plus three thin interactive wrappers. Smoke tests confirm bindings register on load. Known limitation: if another `compilation-finish-functions` hook fires between my add-hook and the compile finishing, the chain can fire on the wrong compile. The hook self-removes on first invocation regardless of which compile it sees. Documented in the impl docstring. Acceptable for v1. Phase 2 will replace F6 with the polyglot test runner (tree-sitter queries for Python/Go/TS, sexp scan for Elisp, buffer-local last-test memory).
* feat(gloss): wire gloss into init via :vc against cjennings.netCraig Jennings2026-04-301-0/+1
| | | | | | | | | | | | Adds modules/gloss-config.el with a use-package form that installs gloss from the cjennings.net bare repo. The bare's post-receive hook mirrors to GitHub, so the package shows up in both places. Eager-loaded so gloss-prefix-map exists at startup. :config calls gloss-install-prefix to bind C-h g. Lands in the "Modules In Test" section of init.el for v1. Can move out after the first-week shakedown shows the package is steady.
* feat(coverage): add cj/coverage-report command and F7 bindingCraig Jennings2026-04-231-0/+2
| | | | | | | | | | | | | | | | | | | Completes the coverage v1 user-facing path. cj/coverage-report is the interactive entry point: 1. Resolves the backend for the current project (honoring cj/coverage-backend from .dir-locals.el). 2. Prompts for a git-diff scope via completing-read (Working tree, Staged, Branch vs parent, Branch vs main). 3. Reads the cached simplecov report, intersects with the diff, renders records into a *Coverage Report* buffer. 4. If the report doesn't exist, prompts to run coverage first. With a prefix argument, re-runs regardless. The report buffer uses cj/coverage-report-mode, a compilation-mode derivative. Uncovered-line entries are formatted as path:line: uncovered so the standard gnu compilation-error-regexp-alist picks them up for next-error navigation. That means M-g n, M-g p, and C-x backtick walk through uncovered lines from any buffer without switching focus. F7 is bound to the command globally, matching the F-key layout ticket's design (F4 compile+run, F5 debug, F6 test, F7 coverage). Added to init.el: (require 'coverage-core) + (require 'coverage-elisp). Tests cover the pure scope-label helpers (label to symbol, symbol to label, roundtrip) plus a smoke test that exercises the full command with stubbed backend, stubbed completing-read, stubbed shell-command-to-string, and a prepared simplecov fixture. Coverage v1 is now functionally complete: make coverage produces the report, F7 drives the interactive flow.
* chore: delete wip.el and remove its stale require from init.elCraig Jennings2026-04-221-1/+0
| | | | | | | | wip.el held commented-out scratch code (efrit, buffer-same-mode, easy-hugo) plus one active pomm use-package block. The require in init.el was itself commented out, so the file compiled on every make compile pass but nothing in it ever ran at startup. The easy-hugo block motivated the new preview and publish commands that landed in the previous commit. The other entries (efrit, buffer-same-mode) have been dead code for months. Also removes the "Cannot load pomm" warning that has been appearing on every make compile run.
* feat: add Slack client module with dashboard integrationCraig Jennings2026-03-061-0/+1
| | | | | | Add emacs-slack config with auth-source credentials, DM/mention-only notifications via notify script, compose buffer workflow, and dashboard icon. Keybindings under C-; S prefix.
* feat(json,yaml): add tree-sitter modes, formatting, and jq integrationCraig Jennings2026-03-021-0/+1
| | | | | | | New prog-json module: json-ts-mode with jq formatting (C-; f) and jq-interactively (C-c C-q). Upgraded prog-yaml to yaml-ts-mode with prettier formatting. Both use treesit-auto for grammar management. Includes 18 new tests (10 JSON, 8 YAML), 185/185 passing.
* feat(restclient): add REST API client for interactive API explorationCraig Jennings2026-02-181-0/+1
| | | | | restclient.el + restclient-jq integration with SkyFi API templates, tutorial file, auto key injection from authinfo, 17 ERT tests.
* feat(reveal): add org-reveal presentation workflow with ERT testsCraig Jennings2026-02-141-0/+1
| | | | | | | Replaced pandoc-based reveal.js export with native ox-reveal integration. New org-reveal-config.el module provides offline, self-contained HTML export with keybindings under C-; p. Includes setup script for reveal.js 5.1.0 and 34 ERT tests covering header template and title-to-filename helpers.
* feat(hugo): extract hugo-config module with C-; h keybindingsCraig Jennings2026-02-141-0/+1
| | | | | | Standalone module for ox-hugo blog workflow. One-file-per-post structure with keybindings for new post, export, open dir (dirvish and system file manager), and toggle draft.
* chore: minor housekeeping updatesCraig Jennings2026-02-041-2/+2
| | | | | | | - Add typo correction: should't -> shouldn't - Add dirvish shortcut pcr for career project - Rename pc -> pcl for clipper project - Minor whitespace cleanup in init.el
* refactor(calendar): move calendar URLs into calendar-sync.elCraig Jennings2026-02-041-16/+4
| | | | | Consolidate calendar configuration within the module itself rather than requiring setup in init.el. Improves module encapsulation.
* feat(calendar-sync): add RECURRENCE-ID exception handling for recurring eventsCraig Jennings2026-02-031-1/+4
| | | | | | | | | | | | | | | | | | | | | Handle rescheduled instances of recurring calendar events by processing RECURRENCE-ID properties from ICS files. When someone reschedules a single instance of a recurring meeting in Google Calendar, the calendar-sync module now shows the rescheduled time instead of the original RRULE time. New functions: - calendar-sync--get-recurrence-id: Extract RECURRENCE-ID from event - calendar-sync--get-recurrence-id-line: Get full line with TZID params - calendar-sync--parse-recurrence-id: Parse into (year month day hour minute) - calendar-sync--collect-recurrence-exceptions: Collect all exceptions by UID - calendar-sync--occurrence-matches-exception-p: Match occurrences to exceptions - calendar-sync--apply-single-exception: Apply exception data to occurrence - calendar-sync--apply-recurrence-exceptions: Apply all exceptions to occurrences Also adds DeepSat calendar configuration (dcal-file) to user-constants, init.el, and org-agenda-config. 48 unit and integration tests added covering normal, boundary, and error cases.
* feat(keyboard): add GUI key translation for M-S- bindingsCraig Jennings2026-02-021-1/+1
| | | | | | | | | | | | | | | Rename terminal-compat.el to keyboard-compat.el and add GUI support. Problem: M-S-o and other Meta+Shift bindings didn't work in GUI mode. GUI Emacs receives M-O (uppercase) but bindings use M-S-o syntax. Terminal can't use M-O due to arrow key escape sequence conflicts. Solution: Use key-translation-map in GUI mode to translate M-O -> M-S-o for all 18 Meta+Shift keybindings. Terminal fixes unchanged. Also fix two test issues: - Remove expected-fail from expand-weekly test (timezone fix resolved it) - Add helpful install messages to dependency-checking tests
* fix(terminal): add console/mosh compatibilityCraig Jennings2026-01-231-0/+1
| | | | | | | | - Create terminal-compat.el for arrow key escape sequences - Fix M-uppercase keybindings (M-O → M-S-o, etc.) that conflicted with terminal escape sequences ESC O A/B/C/D - Add GUI-only guards for emojify and icon rendering - 18 keybindings updated across 13 modules with override comments
* feat(calendar-sync): multi-calendar support with property testsCraig Jennings2025-12-021-4/+8
| | | | | | Added multi-URL calendar sync supporting Google and Proton calendars. Each calendar syncs to separate file with per-calendar state tracking. Added 13 property-based tests for RRULE expansion. Total: 150 tests passing.
* feat(org-noter): implement custom org-noter workflowCraig Jennings2025-11-211-1/+1
| | | | | | | | | | | | Implemented custom org-noter workflow with F6 keybinding: - Creates notes files as org-roam nodes in org-roam-directory - Title prompt with pre-slugified default, notes-on-{slug}.org format - F6 toggles notes window visibility when session active - Preserves PDF fit setting on toggle - Deferred org-roam integration to prevent PDF open hang Also fixed: quick-sdcv quit binding, calendar-sync sentinel buffer error Added 30 ERT tests for title-to-slug and template generation functions
* feat(calendar-sync): Add automatic timezone detection and chronological sortingCraig Jennings2025-11-161-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Implemented calendar-sync.el as a complete replacement for org-gcal, featuring: **Core Functionality:** - One-way sync from Google Calendar to Org (via .ics URL) - UTC to local timezone conversion for all event timestamps - Chronological event sorting (past → present → future) - Non-blocking sync using curl (works reliably in daemon mode) **Automatic Timezone Detection:** - Detects timezone changes when traveling between timezones - Tracks timezone offset in seconds (-21600 for CST, -28800 for PST, etc.) - Triggers automatic re-sync when timezone changes detected - Shows informative messages: "Timezone change detected (UTC-6 → UTC-8)" **State Persistence:** - Saves sync state to ~/.emacs.d/data/calendar-sync-state.el - Persists timezone and last sync time across Emacs sessions - Enables detection even after closing Emacs before traveling **User Features:** - Interactive commands: calendar-sync-now, calendar-sync-start/stop - Keybindings: C-; g s (sync), C-; g a (start auto-sync), C-; g x (stop) - Optional auto-sync every 15 minutes (disabled by default) - Clear status messages for all operations **Code Quality:** - Comprehensive test coverage: 51 ERT tests (100% passing) - Refactored UTC conversion into separate function - Clean separation of concerns (parsing, conversion, formatting, sorting) - Well-documented with timezone behavior guide and changelog **Migration:** - Removed org-gcal-config.el (archived in modules/archived/) - Updated init.el to use calendar-sync - Moved gcal.org to .emacs.d/data/ for machine-independent syncing - Removed org-gcal appointment capture template Files modified: modules/calendar-sync.el:442, tests/test-calendar-sync.el:577 Files created: data/calendar-sync-state.el, tests/testutil-calendar-sync.el Documentation: docs/calendar-sync-timezones.md, docs/calendar-sync-changelog.md
* fix(ui): Fix cursor color updates with post-command-hookCraig Jennings2025-11-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The cursor color was not updating correctly when switching buffers or modifying files. The original implementation used window-buffer-change and other specific hooks, but these were insufficient and internal buffers were interfering with cursor color updates. Root cause: - Cursor color is global (one cursor for all of Emacs) - Previous hooks fired in internal buffer contexts (*Echo Area*, *temp*) - This caused cursor to be set to white (unmodified) even when in read-only buffers like dashboard Solution: - Use post-command-hook which runs after every command in current buffer - Ignore internal buffers (names starting with space) - Cache optimization prevents redundant set-cursor-color calls Behavior now: - Dashboard (read-only): Red cursor - Unmodified file: White cursor - Modified file: Green cursor - After save: White cursor Tests: - Added 9 integration tests in test-ui-cursor-color-integration.el - Tests verify hook installation, buffer switching, modification tracking - All 27 tests passing (18 unit + 9 integration) Integration tests catch issues that unit tests miss: - Unit tests verified state detection logic (✓) - Integration tests verify hooks fire at right times (✓ now) - Integration tests verify real buffer switching behavior (✓ now) Cleanup: - Removed debug code from init.el - Removed debug-cursor-color.el temporary file
* feat:system: Add system utility library with executable checkCraig Jennings2025-11-091-0/+1
| | | | | | | | | | | | | Introduce a new `system-lib.el` module providing low-level system utility functions, including function `cj/executable-exists-p` to check for the availability of programs in PATH. Integrate this library in `init.el`. test(system): Add unit tests for executable check function Create comprehensive unit tests for `cj/executable-exists-p` in `system-lib.el`, ensuring coverage of normal, boundary and error scenarios.
* feat: Add AssemblyAI transcription backend with speaker diarizationCraig Jennings2025-11-061-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Integrated AssemblyAI as the third transcription backend alongside OpenAI API and local-whisper, now set as the default due to superior speaker diarization capabilities (up to 50 speakers). New Features: - AssemblyAI backend with automatic speaker labeling - Backend switching UI via C-; T b (completing-read interface) - Universal speech model supporting 99 languages - API key management through auth-source/authinfo.gpg Implementation: - Created scripts/assemblyai-transcribe (upload → poll → format workflow) - Updated transcription-config.el with multi-backend support - Added cj/--get-assemblyai-api-key for secure credential retrieval - Refactored process environment handling from if to pcase - Added cj/transcription-switch-backend interactive command Testing: - Created test-transcription-config--transcription-script-path.el - 5 unit tests covering all 3 backends (100% passing) - Followed quality-engineer.org guidelines (test pure functions only) - Investigated 18 test failures: documented cleanup in todo.org Files Modified: - modules/transcription-config.el - Multi-backend support and UI - scripts/assemblyai-transcribe - NEW: AssemblyAI integration script - tests/test-transcription-config--transcription-script-path.el - NEW - todo.org - Added test cleanup task (Method 3, priority C) - docs/NOTES.org - Comprehensive session notes added Successfully tested with 33KB and 4.1MB audio files (3s and 9s processing).
* init:doc:correcting comment on video captureCraig Jennings2025-10-311-1/+1
|
* maint:vc install org-msg, disable debugging on org-gcalCraig Jennings2025-10-271-3/+3
|
* refactor: Rename custom-file-buffer to custom-buffer-fileCraig Jennings2025-10-271-3/+4
| | | | | | | | | Renamed the module 'custom-file-buffer' to 'custom-buffer-file' to ensure consistency across the codebase. This change affects module imports and test files. Additionally, new module 'system-commands.el' has been created to handle system power and session management commands, removing these functionalities from 'wip.el'.
* chore:init.el: remove commented import for show-kill-ringCraig Jennings2025-10-271-1/+0
| | | | | Clean up the code by removing an unnecessary commented-out import line for show-kill-ring in the initialization file.
* chore(init): remove test status comments from require statementsCraig Jennings2025-10-271-13/+13
| | | | | Removed comments indicating test status for required modules to clean up and simplify the init.el file.
* feat:browser-config: Integrate browser configuration and add testsCraig Jennings2025-10-271-3/+4
| | | | | | | | | | | | | - Move `browser-config` from 'Modules In Test' to active modules - Refactor browser handling functions for better error handling: - Introduce `cj/--do-apply-browser-choice` and - `cj/--do-choose-browser` Return status symbols for success and - error cases Add comprehensive unit tests in - `tests/test-browser-config.el` Focus on internal `cj/--do-*` - functions and file I/O using temp files Validate return values and - ensure isolated tests with setup/teardown functions Ensure - consistent handling of browser configurations and improve - initialization logic
* feat:jumper: Integrate and enhance 'jumper' module with testsCraig Jennings2025-10-271-1/+1
| | | | | | | | | Enable 'jumper' module by uncommenting its require statement in init.el. Enhance 'jumper' by adding detailed documentation, refactoring logic into internal functions, and updating keybinding setup for better usability. Integrate 'which-key' for improved keybinding assistance. Add comprehensive unit tests for 'jumper' functionalities to ensure reliability.
* feat:text-generation: improve and rename lorem generatorCraig Jennings2025-10-261-1/+1
| | | | | | | | | Rename `lorem-generator.el` to `lorem-optimum.el` for fun. Enhance text tokenization, Markov chain learning, and text generation functions. Introduce new configuration variables for training files and improve efficiency with vectorized access. Add comprehensive benchmarks and unit tests under `tests/`. This improves performance and lays groundwork for further extensions.
* chore: Remove redundant autoload directives from modulesCraig Jennings2025-10-261-1/+1
| | | | | | | Remove unnecessary autoload directives from various functions across multiple modules, cleaning up the codebase and improving readability. These directives were redundant and not needed for the current project setup.
* chore:init.el: update comments and modules loading statusCraig Jennings2025-10-261-15/+14
| | | | | | Refined comments to note completion of module tests. Removed outdated function and disabled a module. Adjusted 'org-roam-config' for test addition.
* chore:init:change marker identifying test progressionCraig Jennings2025-10-261-1/+1
|
* feat:erc: Enable IRC client in dashboard and update keybindingsCraig Jennings2025-10-251-1/+1
| | | | | | | | | | Uncommented ERC client initialization in `init.el`. Replaced "cj/erc-start-or-switch" with "cj/erc-switch-to-buffer-with-completion" in dashboard. Altered keybindings to use "C-; E" instead of "C-c e" for ERC commands. Defined a new keymap "cj/erc-keymap" for better command organization. Removed deprecated `locate-library` checks and `cj/erc-command-map`. Refined code layout for clarity.
* chore:init: Remove obsolete eradio-config require statementCraig Jennings2025-10-251-1/+0
| | | | | The eradio-config dependency has been removed from the init file, potentially because it is no longer needed or has been deprecated.
* feat:browser: Add browser configuration moduleCraig Jennings2025-10-231-1/+1
| | | | | | | Introduce `browser-config.el` to handle browser selection and configuration within Emacs. This module discovers available browsers, allows user selection through `M-x cj/choose-browser`, and persists the choice while supporting all link types.
* chore:init: remove commented-out prog-lsp require lineCraig Jennings2025-10-231-1/+0
| | | | | Clean up init.el by removing the unnecessary commented require statement for prog-lsp.