| Age | Commit message (Collapse) | Author |
|
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>
|
|
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>
|
|
- 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>
|
|
- Automatic abbrev_defs updates from spell corrections
- Added TODO: investigate flyspell-then-abbrev keybinding loss in scratch
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
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)
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Relocated gemini.key.gpg to assets/ folder for better organization.
No code references found in modules directory, so no updates needed.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Moved config-dependencies.org to docs/ folder to keep it private along
with other documentation. The file remains on disk but is now gitignored.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Deleted issues.org file from repository.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
Documented comprehensive session covering:
- Terminology refactor (session β workflow)
- Template enhancements in ~/documents/claude/
- Clear docs/ versioning policy for code vs non-code projects
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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)
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- 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
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
- 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>
|
|
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>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
Added 'wrap up', 'wrap this up', and 'wrap it up' to recognized
wrap-up trigger phrases for future sessions.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
- 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>
|
|
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>
|
|
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>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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 c0c4b17).
Went beyond mood-line with custom segments, interactive features,
and Emacs 30 built-in right-alignment.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
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>
|
|
|
|
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.
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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])
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
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>
|
|
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>
|