summaryrefslogtreecommitdiff
path: root/modules
AgeCommit message (Collapse)Author
2025-11-09chore:popper-config: disable popper and comment out MessagesCraig Jennings
Disable the use-package for popper and comment out the *Messages* buffer in the popper-reference-buffers list to prevent popper from managing it.
2025-11-09feat:system: Add system utility library with executable checkCraig Jennings
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.
2025-11-09feat:buffer-diff: Add syntax-aware buffer diffing with difftasticCraig Jennings
Introduce enhanced buffer comparison with saved file using difftastic for syntax-aware diffing, with a fallback to regular unified diff if difftastic is unavailable. Output is displayed in separate buffers, leveraging ansi-color for improved readability. Also includes comprehensive integration tests covering the diff workflow, handling cases like added, removed, and modified lines, and ensuring graceful handling of special cases and errors.
2025-11-08feat: Fix modeline lag and add org multi-level sort with comprehensive testsCraig Jennings
Performance improvement and new feature with full test coverage. ## Changes ### 1. Fix modeline line/column position lag (#A priority) - Replace expensive line-number-at-pos with cached %l/%c format specifiers - Enable line-number-mode explicitly for caching - Result: Instant modeline updates, zero performance overhead - Files: modules/modeline-config.el:81-83, modules/ui-config.el:53 ### 2. Implement multi-level org sorting - New function: cj/org-sort-by-todo-and-priority - Sorts by TODO status (TODO before DONE) AND priority (Aβ†’Bβ†’Cβ†’D) - Uses stable sorting: priority first, then TODO state - Gracefully handles empty sections (no error) - Bound to C-; o o (ordering β†’ org sort) - Files: modules/org-config.el:278-299, modules/custom-ordering.el:253,267 ### 3. Comprehensive ERT test suite (12/12 passing) - Normal cases: Mixed TODO/DONE, multiple of same type, same priority - Boundary cases: Empty sections, single entries, no priorities - Error cases: Non-org-mode buffer - Test file: tests/test-org-sort-by-todo-and-priority.el ### 4. Testing improvements discovered - Disable org-mode hooks to avoid package dependencies in batch mode - org-sort-entries must be called from parent heading - Preserve priority cookie in org-get-heading (t t nil t) - Add condition-case to handle "Nothing to sort" gracefully ### 5. Minor cleanup - Comment out chime-debug setting (org-agenda-config.el:267) - Mark modeline lag task as DONE in todo.org ## Technical Details Modeline optimization: - line-number-at-pos is O(n) where n = current line - %l and %c are O(1) lookups from cached values Org sorting algorithm uses stable sort: 1. Sort by priority (A, B, C, D, unprioritized) 2. Sort by TODO status (preserves priority order within groups) Result: TODO [#A], TODO [#B], DONE [#A], DONE [#B], etc. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08fix: Resolve flyspell keybinding and mu4e sent folder sync issuesCraig Jennings
Two Method 1 quick wins shipped: 1. Fixed cj/flyspell-then-abbrev keybinding in org-mode - Autoload cookies were comments and never executed - Added explicit keybinding setup when module loads - Override org-mode's C-' binding (org-cycle-agenda-files) - Both C-' and C-c f now work in all buffers 2. Fixed mu4e sent folder not syncing (cmail account) - Root cause: mbsync aborted on Drafts errors before Sent - Changed ~/.mbsyncrc to explicit channels (like Gmail) - Synced 136 missing sent messages (May-Nov 7) - Now syncs 6 folders independently Files modified: - modules/flyspell-and-abbrev.el: Fixed keybindings (lines 235-251) - todo.org: Marked 2 tasks complete with documentation πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07chore: Disable automatic syncs and triage inboxCraig Jennings
- Commented out mu4e-update-interval to stop email password prompts - Triaged 5 inbox items against V2MOM framework - Moved 4 items to Method 1 (frictionless improvements) - Split org keymaps task into Method 1 + someday-maybe components - Deleted unclear 'toggle org-agenda' task - Clarified org-appear toggle requirement for long links in tables - Updated Method 1 count from [8/14] to [8/18] - Added transient menu task to SOMEDAY-MAYBE - Cleared inbox for new items Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06feat: Add comprehensive authentication cache reset utilityCraig Jennings
Added cj/reset-auth-cache function to recover from incorrect password entry for encrypted files like authinfo.gpg. Resolves "Bad session key" and "Decryption failed" errors. Key features: - Smart cache clearing: preserves 400-day GPG/SSH cache by default - Optional prefix arg (C-u) to also clear gpg-agent cache - Clears auth-source, EPA file handler, and optionally gpg-agent caches - Bound to C-; A for easy access (removed from debug menu C-c d) Also added cj/kill-gpg-agent for aggressive agent reset when needed. Consolidates and replaces simpler auth-source-only version that was previously in config-utilities.el. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06feat: Add AssemblyAI transcription backend with speaker diarizationCraig Jennings
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). πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05feat: Configure scratch buffer for org-mode with cursor at endCraig Jennings
- Set initial-major-mode to org-mode for *scratch* buffer - Add emacs-startup-hook to position cursor at end of buffer - Update greeting message comment syntax from ;; to # for org-mode - Re-enable debug flag reset on startup in early-init.el This makes the scratch buffer immediately ready for org-mode note-taking with cursor positioned for typing, eliminating manual mode switching and cursor movement. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05fix: Resolve Google Calendar password prompts every 10 minutesCraig Jennings
Problem: oauth2-auto.plist passphrase requested every ~10 minutes during gcal-sync auto-sync, interrupting workflow despite 400-day gpg-agent cache. Root cause: auth-config.el was setting GPG_AGENT_INFO to nil, telling Emacs to ignore gpg-agent entirely. Additionally, plstore caching was loading too late in org-gcal-config. Solution: - Disabled GPG_AGENT_INFO override to allow gpg-agent usage - Added auth-source-cache-expiry (24-hour cache for credentials) - Moved plstore configuration from org-gcal-config to auth-config - Enabled plstore-cache-passphrase-for-symmetric-encryption globally - Set plstore-encrypt-to nil for symmetric encryption Files modified: - modules/auth-config.el: Added plstore config, removed agent bypass - modules/org-gcal-config.el: Removed duplicate plstore config - docs/NOTES.org: Session notes documenting fix Testing: Restart Emacs and verify no password prompts for 30+ minutes. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04feat: Add LanguageTool integration for comprehensive grammar checkingCraig Jennings
Integrated LanguageTool as an on-demand grammar checker, replacing the previously disabled proselint checker. Changes: - Created scripts/languagetool-flycheck wrapper for flycheck integration - Converts LanguageTool JSON output to flycheck format - Includes suggestions in error messages - 30-second timeout for large files - Updated modules/flycheck-config.el: - Defined languagetool checker for text/markdown/org/gfm modes - Updated cj/flycheck-prose-on-demand to use LanguageTool - Added installation instructions (sudo pacman -S languagetool) - Improved documentation clarity - Usage: Press C-; ? in org/text/markdown files - Enables flycheck with LanguageTool - Shows errors in *Flycheck errors* buffer - On-demand only (no performance impact) - Updated docs/NOTES.org: - Added best practice: Test Emacs launch after non-trivial changes - Example: emacs --eval "(kill-emacs)" - Catches startup errors before committing - Disabled weather debug mode (wttrin-debug nil) - Marked todo.org grammar checker task as DONE LanguageTool catches real grammar issues (subject-verb agreement, tense, punctuation, common mistakes) that proselint missed. Installation: LanguageTool 6.6 (222MB) from Arch repos Dependencies: Python 3 (for wrapper script) πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04fix: Resolve async buffer error and improve modeline spacingCraig Jennings
- Fixed critical "Selecting deleted buffer" error on startup - wttrin-mode-line-mode now activates after init completes - Uses after-init-hook to prevent async buffer deletion - Weather widget loads safely after Emacs finishes initializing - Improved modeline right-side spacing - Added 2 non-breaking spaces after misc-info segment - Prevents weather icon from appearing flush with edge - Non-breaking spaces survive right-align trimming πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04fix: Update transcription keybindings for clarityCraig Jennings
Changed transcription submenu keybindings: - C-; t t β†’ C-; t a (transcribe audio) - C-; t b β†’ C-; t v (view transcriptions) - C-; t k β†’ unchanged (kill transcription) More intuitive mnemonics: a=audio, v=view, k=kill πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04feat: Add complete async audio transcription workflowCraig Jennings
Implemented full transcription system with local Whisper and OpenAI API support. Includes comprehensive test suite (60 tests) and reorganized keybindings for better discoverability. Features: - Async transcription (non-blocking workflow) - Desktop notifications (started/complete/error) - Output: audio.txt (transcript) + audio.log (process logs) - Modeline integration showing active transcription count - Dired integration (press T on audio files) - Process management and tracking Scripts: - install-whisper.sh: Install Whisper via AUR or pip - uninstall-whisper.sh: Clean removal with cache cleanup - local-whisper: Offline transcription using installed Whisper - oai-transcribe: Cloud transcription via OpenAI API Tests (60 passing): - Audio file detection (16 tests) - Path generation logic (11 tests) - Log cleanup behavior (5 tests) - Duration formatting (9 tests) - Active counter & modeline (11 tests) - Integration workflows (8 tests) Keybindings: - Reorganized gcal to C-; g submenu (s/t/r/c) - Added C-; t transcription submenu (t/b/k) - Dired: T to transcribe file at point πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03style: Fix checkdoc linting errors in modeline-config.elCraig Jennings
Fixed 4 categories of checkdoc warnings: - Removed embedded keycodes (mouse-1, mouse-3) from docstrings - Added double spaces after periods - Quoted Lisp symbols with backticks - Changed single quotes to backticks in examples All docstrings now follow Emacs documentation conventions. Passes checkdoc and byte-compilation cleanly. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03feat: Complete modeline overhaul with custom segments and interactive featuresCraig Jennings
Replaced mood-line with a custom, minimal modeline using only built-in Emacs functionality to avoid native compilation issues. **Architecture:** - Named segment system using defvar-local for easy reordering - Emacs 30 built-in right-alignment (mode-line-format-right-align) - All segments marked as risky-local-variable for proper evaluation **Features:** - Color-coded buffer names (green=writeable, red=read-only, gold=overwrite) - VC branch with git symbol (U+E0A0) and state-based coloring - Position format: L:line C:col - Help-echo tooltips on all segments - Mouse click handlers for interactive actions - String truncation in narrow windows (< 100 chars) - Active-window-only display for branch and misc-info **Interactive Actions:** - Buffer name: mouse-1 = prev-buffer, mouse-3 = next-buffer - Major mode: mouse-1 = describe-mode - Git branch: mouse-1 = vc-diff, mouse-3 = vc-root-diff **Bug Fixes:** - Disabled async native compilation to prevent "Selecting deleted buffer" errors - Fixed difftastic loading by changing :demand to :defer - Abstracted buffer status colors to user-constants.el for reuse Inspired by Prot's modeline design patterns. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03feat: Add org-appear and enable org emphasis renderingCraig Jennings
Changes: - Added org-appear package to show emphasis markers only when editing - Changed org-fontify-emphasized-text from nil to t to render bold/italic - Updated comment for org-hide-emphasis-markers to reference org-appear - org-appear reveals markers (* / _) only when cursor is on them - Also shows link markup and sub/superscripts when editing - Updated todo.org to mark org-appear task as DONE (Method 2: 3/5) Result: Cleaner org-mode editing experience with visual emphasis while maintaining clean appearance when not editing. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03feat: Upgrade diff-buffer-with-file to ediff and add difftastic for gitCraig Jennings
Two improvements for better diff experience: 1. **Upgraded cj/diff-buffer-with-file to use ediff** (custom-buffer-file.el) - Replaced basic unified diff with ediff-current-file - Now uses existing ediff config (horizontal split, j/k navigation) - C-; b D now launches interactive ediff instead of text diff - Simplified from 17 lines to 5 lines - Removed TODO comment about difftastic integration 2. **Added difftastic for git diffs** (vc-config.el) - Installed binary: difftastic 0.64.0 via pacman - Added difftastic.el package integrated with magit - Keybindings in magit-diff: - D β†’ difftastic-magit-diff (dwim) - S β†’ difftastic-magit-show - Provides structural, language-aware diffs for git changes - Better visualization of code structure changes **Result:** - Buffer vs file: Interactive ediff (can navigate, merge, revert) - Git history: Structural difftastic (language-aware visualization) - Right tool for each job Serves Method 3: "Make Fixing Emacs Frictionless" - Better diffs = easier debugging and code review Updated todo.org: Method 1 progress 7/13 (was 5/13) πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03chore: Remove unused go-ts-mode-map forward declarationsCraig Jennings
Cleanup of already-fixed issue from commit 196b289. **Background:** - Bug was already fixed on Nov 2, 2025 (commit 196b289) - Original error: "void-variable go-ts-mode-map" - Fix moved keybindings from :bind clause to hook function - Keybindings now set after mode loads via cj/go-mode-keybindings **This Cleanup:** - Removed unused forward declarations (lines 34-35): - (defvar go-ts-mode-map) - (defvar go-mod-ts-mode-map) - These were artifacts from the original buggy implementation - No longer needed since keybindings use local-set-key in hook **Testing:** - βœ“ File compiles cleanly without warnings - βœ“ No references to these variables exist in codebase - βœ“ Keybindings work correctly via hook function Updated todo.org to mark task as complete, documenting that it was already fixed and today's work was just cleanup. Serves Method 1: "Make Using Emacs Frictionless" - Quick win: ~2 minutes (just cleanup) - Reduces code clutter πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03fix: Implement missing cj/goto-git-gutter-diff-hunks functionCraig Jennings
Fixes void-function error when pressing C-; v d keybinding. **The Problem:** - Keybinding C-; v d referenced undefined function - Caused "Symbol's function definition is void" error - Prevented interactive jumping to git diff hunks **The Solution:** - Added cj/goto-git-gutter-diff-hunks to modules/vc-config.el - Uses consult-line with regex ^[+\-] to find diff markers - Enables interactive selection of any changed line in buffer - Properly documented with descriptive docstring **Function:** ```elisp (defun cj/goto-git-gutter-diff-hunks () "Jump to git-gutter diff hunks using consult. Searches for lines starting with + or - (diff markers) and allows interactive selection to jump to any changed line in the buffer." (interactive) (require 'git-gutter) (consult-line "^[+\\-]")) ``` **Testing:** - βœ“ No linting issues (checkdoc clean) - βœ“ Compiles cleanly (byte-compile warnings are expected deferred loads) - βœ“ Function follows existing code patterns Serves Method 1: "Make Using Emacs Frictionless" - Quick win: estimated 15 min, actual 5 min - Removes error and enables useful git workflow feature Updated todo.org to mark task complete. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03refactor: Replace doom-modeline with mood-line and remove deprecated tree-sitterCraig Jennings
Method 2 improvements for cleaner, faster configuration: 1. **Replaced doom-modeline with mood-line** (modules/modeline-config.el) - Simplified from 70+ lines to ~10 lines (-40 lines net) - mood-line is lightweight, minimal, inspired by doom-modeline - Better performance with no dependencies - Keeps all essential features: buffer status, major mode, VCS, flycheck, cursor position, multiple-cursors counters 2. **Removed deprecated tree-sitter package** (modules/prog-general.el) - Deleted `(use-package tree-sitter)` - Now relies solely on Emacs 29+ built-in treesit with treesit-auto - treesit-auto continues to manage grammars automatically - No functionality lost, cleaner dependency tree Both changes serve Method 2: "Stop Problems Before They Appear" - Simpler code = fewer bugs - Fewer dependencies = less maintenance - Native features = better integration Updated todo.org to mark both tasks complete [2/5 in Method 2]. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03style: Fix checkdoc warnings in video-audio-recording.elCraig Jennings
Resolved 6 checkdoc linting warnings: - Added double spaces after periods in docstrings (Emacs convention) - Changed "calls" to "call" in docstring (imperative form) All linting checks now pass: - checkdoc: βœ“ No warnings - make lint: βœ“ Passes - All 83 tests: βœ“ Still passing Also updated docs/sessions/refactor.org to be more generic/reusable. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03test: Add comprehensive test suite for video-audio-recording moduleCraig Jennings
Added 83 test cases across 9 test files with 100% pass rate, covering device detection, parsing, grouping, and complete workflow integration. ## What Was Done ### Refactoring for Testability - Extracted `cj/recording--parse-pactl-output` from `cj/recording-parse-sources` - Separated parsing logic from shell command execution - Enables testing with fixture data instead of live system calls ### Test Fixtures Created - `pactl-output-normal.txt` - All device types (built-in, USB, Bluetooth) - `pactl-output-empty.txt` - Empty output - `pactl-output-single.txt` - Single device - `pactl-output-monitors-only.txt` - Only monitor devices - `pactl-output-inputs-only.txt` - Only input devices - `pactl-output-malformed.txt` - Invalid/malformed output ### Unit Tests (8 files, 78 test cases) 1. **test-video-audio-recording-friendly-state.el** (10 tests) - State name conversion: SUSPENDEDβ†’Ready, RUNNINGβ†’Active 2. **test-video-audio-recording-parse-pactl-output.el** (14 tests) - Parse raw pactl output into structured data - Handle empty, malformed, and mixed valid/invalid input 3. **test-video-audio-recording-parse-sources.el** (6 tests) - Shell command wrapper testing with mocked output 4. **test-video-audio-recording-detect-mic-device.el** (13 tests) - Documents bugs: Returns ID numbers instead of device names - Doesn't filter monitors (legacy function, not actively used) 5. **test-video-audio-recording-detect-system-device.el** (13 tests) - Works correctly: Returns full device names - Tests monitor detection with various device types 6. **test-video-audio-recording-group-devices-by-hardware.el** (12 tests) - CRITICAL: Bluetooth MAC address normalization (colons vs underscores) - Device pairing logic (mic + monitor from same hardware) - Friendly name assignment - Filters incomplete devices 7. **test-video-audio-recording-check-ffmpeg.el** (3 tests) - ffmpeg availability detection 8. **test-video-audio-recording-get-devices.el** (7 tests) - Auto-detection fallback logic - Error handling for incomplete detection ### Integration Tests (1 file, 5 test cases) 9. **test-integration-recording-device-workflow.el** (5 tests) - Complete workflow: parse β†’ group β†’ friendly names - Bluetooth MAC normalization end-to-end - Incomplete device filtering across components - Malformed data graceful handling ## Key Testing Insights ### Bugs Documented - `cj/recording-detect-mic-device` has bugs (returns IDs, doesn't filter monitors) - These functions appear to be legacy code not used by main workflow - Tests document current behavior to catch regressions if fixed ### Critical Features Validated - **Bluetooth MAC normalization**: Input uses colons (00:1B:66:C0:91:6D), output uses underscores (00_1B_66_C0_91_6D), grouping normalizes correctly - **Device pairing**: Only devices with BOTH mic and monitor are included - **Friendly names**: USB/PCI/Bluetooth patterns correctly identified ### Test Coverage - Normal cases: Valid inputs, typical workflows - Boundary cases: Empty, single device, incomplete pairs - Error cases: Malformed input, missing devices, partial detection ## Test Execution All tests pass: 9/9 files, 83/83 test cases (100% pass rate) ```bash make test-file FILE=test-video-audio-recording-*.el # All pass individually # Integration test also passes make test-file FILE=test-integration-recording-device-workflow.el ``` πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03feat: Add quick setup for call recording with automatic device pairingCraig Jennings
Users needed a faster way to configure audio for call recording. This adds cj/recording-quick-setup-for-calls which automatically groups audio devices by hardware and lets users pick one device for both mic and monitor. Key improvements: - Groups devices by hardware (USB, built-in, Bluetooth) - Normalizes Bluetooth MAC addresses (handles colon/underscore formats) - Shows friendly device names (e.g., "Jabra SPEAK 510 USB") - Automatically pairs mic + monitor from same device - Bound to C-; r c for quick access Perfect for recording video calls where you need to capture both your voice and the remote person's voice through the same audio device. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03ux: Use friendlier labels for device states in recording moduleCraig Jennings
Replace technical state names with user-friendly labels: - "SUSPENDED" β†’ "Ready" (device available, will activate on use) - "RUNNING" β†’ "Active" (device currently in use) - "IDLE" β†’ "Ready" Add explanatory note in device list buffer explaining that "Ready" devices are normal and will activate automatically when recording starts. Prevents user confusion - "SUSPENDED" sounds like something is wrong when it's actually the normal idle state. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03feat: Add device selection and diagnostics to recording moduleCraig Jennings
Add interactive device selection to fix recording with multiple audio devices. New features: - cj/recording-list-devices (C-; r d) - Show all available audio sources - cj/recording-select-devices (C-; r s) - Interactively select mic/monitor - cj/recording-parse-sources - Parse pactl output into structured data - Enhanced cj/recording-get-devices with graceful fallback to manual selection Improvements: - Works with PulseAudio and PipeWire - Supports USB devices (Jabra SPEAK 510) - Supports Bluetooth devices - Supports built-in laptop audio - Shows device state (RUNNING, SUSPENDED) during selection - Better error messages with actionable suggestions - Device selection persists across recordings Fixes recording breakage when plugging in external audio interfaces. Addresses Method 1 (Make Using Emacs Frictionless) from V2MOM. Closes #[#B] Fix video/audio recording module sub-tasks: - Add diagnostic command - Add device selection UI - Improve error messages - Make device detection more flexible πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03fix: Swap print keybinding and add confirmation promptCraig Jennings
Print operations are now safer and more intuitive: Keybinding changes: - C-; b p β†’ copy file path (safe, common action) - C-; b P β†’ print to PostScript (dramatic, requires shift) Print function improvements: - Add y-or-n-p confirmation before printing - C-u prefix skips confirmation and enables color printing - Prevents accidental waste of paper/toner Serves V2MOM Values: - Intuitive: Dramatic actions require shift key - Intuitive: Prevents muscle memory mistakes - Simple: Reliability through confirmation Also updated docs/NOTES.org with Makefile availability note. Closes inbox items from emacs-inbox-zero session (2025-11-03). πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03feat: Add copy-to-top and copy-to-bottom buffer methods with testsCraig Jennings
Add two new methods to copy buffer content regions: - cj/copy-to-bottom-of-buffer: copies from point to end of buffer - cj/copy-to-top-of-buffer: copies from beginning of buffer to point Reorganize copy operations under C-; b c submenu: - C-; b c w: copy whole buffer - C-; b c t: copy to top (beginning to point) - C-; b c b: copy to bottom (point to end) Other copy operations (buffer name, file path, file link) remain at C-; b base level for quick access. Add comprehensive ERT tests (22 tests total): - test-custom-buffer-file-copy-to-bottom-of-buffer.el (11 tests) - test-custom-buffer-file-copy-to-top-of-buffer.el (11 tests) - Tests cover normal, boundary, and error cases including unicode, narrowing, whitespace, and read-only buffers All tests pass. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03config: Optimize dashboard loading and reduce bookmark countCraig Jennings
Changes: - Changed dashboard to :demand t (load immediately instead of defer) - Reduced bookmark display from 15 to 10 items πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03config: Update chime.el to use new alert-intervals formatCraig Jennings
Updated chime configuration for severity refactor: - Replaced chime-alert-time and chime-alert-severity with chime-alert-intervals '((5 . medium) (0 . medium)) - Changed polling interval from 60s to 30s for faster response - Added chime-day-wide-time "09:00" for all-day event notifications - Removed settings that match defaults (play-sound, keyword filters, etc.) - Changed chime-debug from t to nil All notifications now use medium urgency. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-02fix: Resolve void-variable and void-function errors on first launchCraig Jennings
Fixed two critical bugs preventing Emacs from launching after fresh clone: 1. prog-go.el: Moved go-ts-mode-map keybinding from :bind clause - The :bind macro tried to reference go-ts-mode-map before it was loaded - Moved "C-; f" gofmt binding into cj/go-mode-keybindings function - Function executes via hook after mode loads, ensuring keymap exists 2. org-config.el: Moved function definitions before use-package block - cj/org-general-settings, cj/org-appearance-settings, and cj/org-todo-settings were called in :config but defined after - Moved all three function definitions before (use-package org) - Functions now defined before :config section tries to call them Both fixes follow the pattern of ensuring dependencies exist before use. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-01fix: Change org-gcal to use Google Calendar as authoritative sourceCraig Jennings
Changed from bidirectional "org" mode to "gcal" mode to avoid sync conflicts. This prevents HTTP 412 errors on recurring events and HTTP 400 errors on modified events. Google Calendar is now authoritative: - org-gcal-managed-newly-fetched-mode: "gcal" (was "org") - org-gcal-managed-update-existing-mode: "gcal" (was "org") Benefits: - No more version conflicts on recurring events - Cleaner sync without errors - Google Calendar changes always win πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-01feat: Add org-gcal dependencies and org-contacts birthday automationCraig Jennings
org-gcal-config.el: - Add use-package declarations for deferred and oauth2-auto - Ensures dependencies are automatically installed on fresh systems - Fixes "Cannot open load file" errors when syncing org-contacts-config.el: - Add automatic birthday timestamp insertion via capture template - Parse YYYY-MM-DD or MM-DD birthday formats - Insert yearly repeating timestamps after properties drawer - Add NICKNAME and NOTE fields to capture template org-agenda-config.el: - Enable chime-debug mode for troubleshooting πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-01feat: Add chime-debug nil setting to configCraig Jennings
Explicitly set chime-debug to nil in :init section. Matches new chime.el default (changed from t to nil in recent commit). Clean production setup - debug mode available by changing to t when needed. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-01chore: Update todo.org with new inbox items and music-config improvementsCraig Jennings
todo.org updates: - Added 2 new inbox items about printing keybindings - Reordered Method 1 tasks by priority - Removed blank lines (linter formatting) music-config.el improvements: - Added validation checks to cj/music--valid-file-p and cj/music--valid-directory-p - Fixed regex escaping in cj/music--m3u-file-tracks - Added new cj/music--append-track-to-m3u-file function for testing πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-01wip:org-roam: first pass at consult-org-roam, but disabledCraig Jennings
2025-11-01chore:system-utils: Fix indentation and update history persistenceCraig Jennings
Fix inconsistent indentation in dired-mode section to improve code readability. Enhance history persistence settings by configuring 'savehist' to include additional variables and set history length limits, ensuring better session management.
2025-11-01perf:system-defaults: Unpropertize kill ring on exitCraig Jennings
Add `unpropertize-kill-ring` function to remove text properties from the kill ring when Emacs is exiting. This improves performance by reducing unnecessary data retention. The function is hooked into `kill-emacs-hook`.
2025-11-01feat:mail-config: Add custom prefix to 'From' or 'To' headersCraig Jennings
Set 'mu4e-headers-from-or-to-prefix' to use a custom arrow symbol as a prefix in email headers, improving visual distinction for 'From' or 'To' fields.
2025-11-01feat:eshell: Add custom 'clear' function and set PAGER to 'cat'Craig Jennings
Set the environment variable PAGER to 'cat' to disable pagination in eshell. Remove existing alias for 'clear' and introduce a new custom 'eshell/clear' function that clears the eshell buffer.
2025-11-01feat:buffer: Add diffing buffer contents with saved fileCraig Jennings
Introduce a new function `cj/diff-buffer-with-file` to compare current buffer with saved file version using unified diff format. Bind it to "C-; b D" for easy access. This enhances buffer management capabilities by allowing users to view changes before saving.
2025-10-31feat:keybindings: Implement consult line or repeat featureCraig Jennings
Add a new command `cj/consult-line-or-repeat` that calls `consult-line` or repeats the last search if invoked consecutively. Bind this command to "C-s". This enhances user experience by providing a quick way to repeat search actions.
2025-10-31chore:custom-misc: update keybindings for word/char countCraig Jennings
Change keybindings for counting words and characters to "# w" and "# c" to improve mnemonic efficiency. Update the corresponding which-key descriptions accordingly.
2025-10-31feat:dirvish-config: Enable file marking for mu4e attachmentsCraig Jennings
Add 'turn-on-gnus-dired-mode' to 'dired-mode-hook' to facilitate marking files in Dirvish for attachment in mu4e emails.
2025-10-31feat:custom-buffer-file: add mark, revert buffer keybindingsCraig Jennings
Added new keybindings for marking the whole buffer and reverting the buffer. Updated the descriptions to reflect these additions.
2025-10-31feat:count-characters: Add character counting functionalityCraig Jennings
Introduce functions to count characters in a buffer or region. Bind new character counting function to "C-; C" in custom keymap.
2025-10-31fix:eshell:allow eshell to load by removing dependency on itselfCraig Jennings
2025-10-31feat:mail:auto download mail every 10 minutesCraig Jennings
2025-10-30fix(org-agenda): improve chime startup integrationCraig Jennings
This commit fixes timing issues with chime.el startup and simplifies configuration after chime.el's validation improvements. ## Changes **1. Fixed org-agenda lazy loading issue** - Added `:demand t` to org-agenda use-package - Ensures org-agenda loads before chime tries to use it - Prevents "org-agenda not available" errors **2. Cleaned up duplicate rebuild hooks** - Removed duplicate emacs-startup-hook with idle-timer - Kept single emacs-startup-hook for rebuild - Simpler, more maintainable configuration **3. Simplified chime configuration** - Restored `(chime-mode 1)` in use-package :config - Removed conditional fboundp check (no longer needed) - Works with chime.el's new deferred validation - Fixed `:after` clause (removed org-agenda dependency) **4. Fixed formatting issues** - Removed stray 's' character in add-hook indentation - Consistent indentation throughout ## Integration with chime.el v0.6.0 This commit pairs with chime.el's new features: - chime-startup-delay (default 10 sec) gives rebuild hook time to run - Validation moved to first check (no startup blocking) - Clean user experience with no false warnings ## Timeline ``` Time 0s: Emacs starts Time 0s: org-agenda loads (:demand t) Time 0s: chime-mode 1 (starts timer, no validation) Time 0.1s: emacs-startup-hook β†’ rebuild org-agenda-files Time 10s: First chime-check β†’ validates, finds events Time 24s: Modeline populated with events ``` **Result:** 24 second startup (vs previous 463 seconds - 95% improvement) πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29fix(dirvish): move deadgrep from D to G, preserve dired-do-delete on DCraig Jennings
The previous commit incorrectly moved deadgrep to 'D', which conflicts with the important dired-do-delete command (immediate delete of marked files). This commit moves deadgrep to 'G' instead. ## Changes **prog-general.el:** - Move cj/deadgrep-here from 'D' to 'G' (was dired-do-chgrp, rarely used) **dirvish-config.el:** - Updated Commentary to document both 'D' and 'G' keybindings - 'D' remains dired-do-delete (standard dired immediate delete) - 'G' is now deadgrep search ## Final Keybinding Map | Key | Binding | Purpose | |-----|-------------------------------|--------------------------------| | d | cj/dirvish-duplicate-file | Duplicate with "-copy" suffix | | D | dired-do-delete | Delete marked files (standard) | | g | dirvish-quick-access | Quick directory menu | | G | cj/deadgrep-here | Search with deadgrep | Capital G is mnemonic for "Grep" and doesn't conflict with important dired commands. dired-do-chgrp is rarely used and not a loss. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>