aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* fix: Resolve flyspell keybinding and mu4e sent folder sync issuesCraig Jennings2025-11-082-7/+44
| | | | | | | | | | | | | | | | | | | | 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
* chore: Disable automatic syncs and triage inboxCraig Jennings2025-11-072-3/+27
| | | | | | | | | | | | - 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
* chore: Update abbrev corrections and add flyspell TODOCraig Jennings2025-11-062-5/+7
| | | | | - Automatic abbrev_defs updates from spell corrections - Added TODO: investigate flyspell-then-abbrev keybinding loss in scratch
* feat: Add comprehensive authentication cache reset utilityCraig Jennings2025-11-062-11/+62
| | | | | | | | | | | | | | | | | 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.
* feat: Add high-priority task for Google Calendar password promptsCraig Jennings2025-11-061-1/+47
| | | | | | | | | | | | | | | | | | | | | | Added comprehensive TODO to Method 1 (priority A) to fix the irritating issue where gcal-sync triggers password prompts every 15 minutes, interrupting workflow and breaking concentration. Task includes: - Current setup documentation (GPG agent, plstore, auth-source config) - Problem analysis (plstore cache, oauth2-auto token refresh) - Six investigation paths to try - File references for debugging - V2MOM alignment (violates "Frictionless" value) This is a daily irritant that needs fixing - password prompts every 15 minutes during calendar sync defeat the purpose of having 400-day GPG cache configured. Related files: - modules/auth-config.el (plstore and GPG configuration) - modules/org-gcal-config.el (org-gcal and oauth2-auto setup) - ~/.gnupg/gpg-agent.conf (GPG agent cache settings)
* chore: Move gemini.key.gpg to assets folderCraig Jennings2025-11-061-0/+0
| | | | | Relocated gemini.key.gpg to assets/ folder for better organization. No code references found in modules directory, so no updates needed.
* chore: Move config-dependencies.org to docs folderCraig Jennings2025-11-061-426/+0
| | | | | Moved config-dependencies.org to docs/ folder to keep it private along with other documentation. The file remains on disk but is now gitignored.
* chore: Remove issues.orgCraig Jennings2025-11-061-1881/+0
| | | | Deleted issues.org file from repository.
* chore: Move .claude folder to .gitignoreCraig Jennings2025-11-062-25/+3
| | | | | | | | | | | | Removed .claude/ from version control to keep personal Claude Code configuration and custom commands private. The folder remains on disk but is no longer tracked by git. Files removed from tracking: - .claude/commands/wrap-it-up.md (custom command) - .claude/settings.local.json (local settings) The .claude/ folder still exists locally but is now gitignored.
* chore: Move docs folder to .gitignoreCraig Jennings2025-11-069-5471/+3
| | | | | | | | | | | | | | | Removed docs/ from version control to keep session notes, personal workflows, and V2MOM documentation private. These files remain on disk but are no longer tracked by git. Files removed from tracking: - docs/NOTES.org (session history) - docs/EMACS-CONFIG-V2MOM.org (personal goals) - docs/SOMEDAY-MAYBE.org (research backlog) - docs/values-comparison.org - docs/workflows/*.org (workflow templates) The docs/ folder still exists locally but is now gitignored.
* feat: Add AssemblyAI transcription backend with speaker diarizationCraig Jennings2025-11-069-1336/+463
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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).
* docs: Add session notes for terminology refactor and template polishCraig Jennings2025-11-051-0/+57
| | | | | | | Documented comprehensive session covering: - Terminology refactor (session → workflow) - Template enhancements in ~/documents/claude/ - Clear docs/ versioning policy for code vs non-code projects
* refactor: Rename "session" to "workflow" for documented processesCraig Jennings2025-11-056-53/+1359
| | | | | | | | | | | | | | | | | | | | | | | | | | This resolves the ambiguity where "session" meant two different things: - Working session (time period we work together) - Documented routine/workflow (process to achieve a goal) Changes: - Renamed docs/sessions/ → docs/workflows/ - Renamed create-session.org → create-workflow.org - Updated all references throughout: - "session type" → "workflow" - "session workflow" → "workflow" - "session definition" → "workflow definition" - "Available Session Types" → "Available Workflows" Updated files: - docs/NOTES.org - All workflow references updated - docs/workflows/*.org - All workflow files updated with new terminology - ~/documents/claude/NOTES.org - Template updated - ~/documents/claude/NOTES-NEW.org - New template updated Terminology now clear: - "Let's run the refactor workflow" = Execute existing workflow - "I want to create a refactor workflow" = Create new workflow definition - "This session" = Working time period (unchanged)
* docs: Create generic V2MOM session workflow and consolidate NOTES.orgCraig Jennings2025-11-054-401/+1100
| | | | | | | | | | | | | | | - Created docs/sessions/create-v2mom.org with fully generic V2MOM workflow - Applicable to any project: health, finance, software, personal goals - 8-phase process with examples across multiple domains - Time estimate: 2-3 hours to create a V2MOM - Consolidated NOTES.org files (deleted root, enhanced docs/NOTES.org) - Integrated generic protocols from template - Added User Information, Session Protocols, File Preferences sections - Enhanced with Reminders Protocol and wrap-up workflow - Single comprehensive 1252-line reference for all sessions - Updated docs/EMACS-CONFIG-V2MOM.org metadata
* feat: Configure scratch buffer for org-mode with cursor at endCraig Jennings2025-11-054-13/+56
| | | | | | | | | | | - 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.
* fix: Resolve Google Calendar password prompts every 10 minutesCraig Jennings2025-11-053-6/+71
| | | | | | | | | | | | | | | | | | | | | | | 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.
* docs: Add comprehensive external dependencies auditCraig Jennings2025-11-042-0/+471
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Created config-dependencies.org documenting all external (non-Emacs) dependencies required for full configuration functionality. Analysis covers: - ~50 external dependencies across all feature areas - Organized by functionality (media, email, programming, documents, etc.) - Package names for pacman/yay/pip/npm/go installation - Required vs optional status for each dependency - Quick reference commands for minimal/recommended/full installs Key features documented: - Audio/video recording (ffmpeg, libpulse) - Transcription (whisper, languagetool) - Email (mu, isync, msmtp) - Programming language support (LSP servers for Go, Python, C, Bash, JS/TS) - Document generation (pandoc, LaTeX, PDF tools) - Media handling (yt-dlp, mpv) - Desktop integration (dunst, xdg-utils) Next steps: - Compare with archsetup script to identify gaps - Create dependency verification script - Ensure archsetup installs all Emacs requirements Session notes added documenting the analysis process.
* docs: Add wrap-up phrase variations to NOTES.orgCraig Jennings2025-11-041-2/+2
| | | | | Added 'wrap up', 'wrap this up', and 'wrap it up' to recognized wrap-up trigger phrases for future sessions.
* docs: Add session notes for 2025-11-04 grammar checker test suiteCraig Jennings2025-11-041-0/+66
| | | | | | | | Documented comprehensive test suite implementation: - 15 tests covering LanguageTool integration (6 unit + 9 integration) - Test fixtures with known grammar errors - Applied quality-engineer.org testing philosophy - All tests passing and integrated with Makefile
* test: Add comprehensive test suite for LanguageTool grammar checkingCraig Jennings2025-11-045-0/+278
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Created complete test coverage for the LanguageTool integration: Unit Tests (test-flycheck-languagetool-setup.el): - 6 tests covering installation and configuration - Verifies LanguageTool binary availability - Checks wrapper script exists and is executable - Validates wrapper script structure (shebang, imports) - Tests error handling for missing arguments - All tests pass ✓ Integration Tests (test-integration-grammar-checking.el): - 9 tests covering end-to-end grammar checking workflow - Tests wrapper script with real LanguageTool execution - Validates output format (filename:line:column: message) - Tests normal cases (error detection, formatting) - Tests boundary cases (empty files, single word, multiple paragraphs) - Tests error cases (nonexistent files, missing arguments) - Uses real test fixtures with known grammar errors - All tests pass ✓ (takes ~35 seconds due to LanguageTool execution) Test Fixtures (tests/fixtures/grammar-*.txt): - grammar-errors-basic.txt: Common errors (subject-verb, could of, etc.) - grammar-errors-punctuation.txt: Punctuation and spacing errors - grammar-correct.txt: Clean text with no errors Testing Philosophy Applied: - Focus on OUR code (wrapper script), not flycheck internals - Trust external frameworks work correctly - Test real integration (wrapper → LanguageTool → output) - No mocking of domain logic, only external side-effects - Clear test categories: Normal, Boundary, Error cases - Comprehensive docstrings listing integrated components - Deterministic tests using real fixtures Usage: make test-file FILE=test-flycheck-languagetool-setup.el make test-file FILE=test-integration-grammar-checking.el make test-integration # Includes grammar integration test Tests automatically discovered by Makefile wildcards.
* feat: Add LanguageTool integration for comprehensive grammar checkingCraig Jennings2025-11-045-30/+162
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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)
* fix: Resolve async buffer error and improve modeline spacingCraig Jennings2025-11-043-3/+64
| | | | | | | | | | | | - 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
* fix: Update transcription keybindings for clarityCraig Jennings2025-11-042-6/+6
| | | | | | | | | 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
* feat: Add complete async audio transcription workflowCraig Jennings2025-11-0414-16/+1276
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* docs: Add session notes for 2025-11-03 modeline polish workCraig Jennings2025-11-031-0/+39
| | | | | | | | | Session Summary: - Fixed all checkdoc linting errors in modeline-config.el - Created /wrap-it-up workflow automation (slash command + phrase recognition) - Added reminder for Flymake/Flycheck modeline integration decision All work committed and pushed. Clean session ending.
* docs: Add reminder for Flymake/Flycheck modeline integration decisionCraig Jennings2025-11-031-0/+25
| | | | | | | | | | | | | Added new "PENDING DECISIONS" section to NOTES.org with reminder about modeline error/warning integration discussion. Questions to decide: - Flymake vs Flycheck - Format preference (counts vs symbols, clickable?) - Placement (left vs right side) - Active window only? Implementation ready - just needs user preferences.
* feat: Add /wrap-it-up slash command and phrase recognitionCraig Jennings2025-11-032-0/+49
| | | | | | | | | | | | | | | | | Created comprehensive session wrap-up workflow triggered by: - Slash command: /wrap-it-up - Phrases: "let's wrap it up", "that's a wrap", "let's call it a wrap" Workflow: 1. Write session notes to docs/NOTES.org (decisions, work, context) 2. Git commit and push all changes to all remotes 3. Friendly goodbye summary with accomplishments and reminders Added dual documentation: - .claude/commands/wrap-it-up.md for explicit /wrap-it-up command - docs/NOTES.org terminology section for phrase recognition Makes session endings consistent and ensures no work is lost.
* style: Fix checkdoc linting errors in modeline-config.elCraig Jennings2025-11-031-5/+5
| | | | | | | | | | | 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.
* chore: Update mood-line task in todo.org with actual implementation detailsCraig Jennings2025-11-031-7/+29
| | | | | | Updated DONE task to reflect that we built a custom modeline instead of just switching to mood-line. Added comprehensive details about features, architecture, and bug fixes.
* chore: Close modeline-related TODOsCraig Jennings2025-11-031-25/+27
| | | | | | | | | | Marked two modeline migration tasks as DONE: - [#D] Consider moving from doom-modeline to mood-line - [#B] Switch doom-modeline to mood-line Both completed via custom modeline implementation (commit 97b03e6). Went beyond mood-line with custom segments, interactive features, and Emacs 30 built-in right-alignment.
* feat: Complete modeline overhaul with custom segments and interactive featuresCraig Jennings2025-11-036-29/+239
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* feat: Add org-appear and enable org emphasis renderingCraig Jennings2025-11-032-5/+20
| | | | | | | | | | | | | 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.
* Monday, November 03, 2025 at 04:16:44 PM CSTCraig Jennings2025-11-031-0/+125
|
* test: Add unit tests for music config and org-contacts functionsCraig Jennings2025-11-0311-0/+1583
| | | | | | | | | | | | | | | | | Add comprehensive unit tests for various Emacs Lisp functions, covering M3U file handling, music file validation, and contact capture template finalization: - Tests for appending tracks to M3U files Tests for recursive music - collection Tests for completion table creation Tests for - extracting M3U basenames and files Tests for M3U file parsing - Tests for filename sanitization Tests for directory and file - validity checks Tests for org-contacts capture template - finalization Each test validates normal, boundary, and error conditions. These tests improve code reliability by verifying expected behavior across a range of scenarios.
* feat: Upgrade diff-buffer-with-file to ediff and add difftastic for gitCraig Jennings2025-11-033-19/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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)
* chore: Remove unused go-ts-mode-map forward declarationsCraig Jennings2025-11-032-5/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Cleanup of already-fixed issue from commit e286f96. **Background:** - Bug was already fixed on Nov 2, 2025 (commit e286f96) - 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
* fix: Implement missing cj/goto-git-gutter-diff-hunks functionCraig Jennings2025-11-032-2/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* refactor: Replace doom-modeline with mood-line and remove deprecated tree-sitterCraig Jennings2025-11-033-83/+37
| | | | | | | | | | | | | | | | | | | | | | | | 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].
* docs: Mark video-audio-recording tasks as complete in todo.orgCraig Jennings2025-11-031-17/+72
| | | | | | | | | | | | | | | | | | | | | | | Completed tasks: ✅ Fix video/audio recording module [#B] ✅ Add diagnostic command cj/recording-list-devices [#A] ✅ Add device selection UI [#A] ✅ Improve error messages [#B] ✅ Make device detection more flexible [#B] ✅ Add comprehensive test coverage [#A] Work summary: - Created 2 device selection workflows (manual + quick call setup) - Implemented smart device grouping with Bluetooth MAC normalization - Added diagnostic listing command - Built comprehensive test suite (9 files, 83 tests, 100% pass) - Refactored code for testability - Fixed all linting warnings Remaining open: - Validate recording startup [#B] - Add device testing command [#C] - Recording status display, presets, history (all [#C])
* style: Fix checkdoc warnings in video-audio-recording.elCraig Jennings2025-11-032-210/+234
| | | | | | | | | | | | | 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.
* test: Add comprehensive test suite for video-audio-recording moduleCraig Jennings2025-11-0316-5/+1265
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 ```
* feat: Add quick setup for call recording with automatic device pairingCraig Jennings2025-11-031-1/+71
| | | | | | | | | | | | | | | | 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.
* ux: Use friendlier labels for device states in recording moduleCraig Jennings2025-11-031-4/+16
| | | | | | | | | | | | | 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.
* feat: Add device selection and diagnostics to recording moduleCraig Jennings2025-11-032-3/+134
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* fix: Swap print keybinding and add confirmation promptCraig Jennings2025-11-033-11/+44
| | | | | | | | | | | | | | | | | | | | | | 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).
* feat: Add comprehensive Makefile for testing and validationCraig Jennings2025-11-034-75/+301
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add Makefile adapted from chime.el with targets for: Testing: - make test - Run all tests (unit + integration) - make test-unit - Run unit tests only - make test-integration - Run integration tests only - make test-file FILE=<filename> - Run specific test file - make test-name TEST=<pattern> - Run tests matching pattern Validation: - make validate-parens - Check for unbalanced parentheses - make validate-modules - Load all modules to verify compilation - make compile - Byte-compile all modules - make lint - Run checkdoc, package-lint, elisp-lint Utilities: - make profile - Profile Emacs startup - make clean - Remove test artifacts and compiled files - make clean-compiled - Remove .elc/.eln files only - make clean-tests - Remove test artifacts only - make reset - Reset to first launch (destructive!) Default target is 'make help' which displays all available targets. Inline scripts from scripts/ directory: - delete-elisp-compiled-files.sh → make clean-compiled - profile-dotemacs.sh → make profile - reset-to-first-launch.sh → make reset Delete inlined scripts to reduce duplication.
* feat: Add copy-to-top and copy-to-bottom buffer methods with testsCraig Jennings2025-11-033-11/+417
| | | | | | | | | | | | | | | | | | | | | | 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.
* config: Optimize dashboard loading and reduce bookmark countCraig Jennings2025-11-031-2/+2
| | | | | | Changes: - Changed dashboard to :demand t (load immediately instead of defer) - Reduced bookmark display from 15 to 10 items
* config: Update chime.el to use new alert-intervals formatCraig Jennings2025-11-031-26/+16
| | | | | | | | | | | | 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.
* fix: Resolve void-variable and void-function errors on first launchCraig Jennings2025-11-022-98/+98
| | | | | | | | | | | | | | | | | 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.