| Age | Commit message (Collapse) | Author |
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
Document lessons learned from chime-org-contacts.el development about
preventing parenthesis errors in Emacs Lisp code.
Key Topics:
- AI code generation strategies (small functions, immediate testing)
- Human developer tools (paredit, smartparens, rainbow-delimiters)
- Real-world case study from chime-org-contacts.el refactoring
- Tools and workflow summary table
Problem Identified:
Both AI and humans struggle with deeply nested Emacs Lisp functions
due to difficulty counting parentheses manually.
Solution Documented:
Break complex functions into small (< 15 line) helpers:
- Easier to verify correctness
- Easier to test independently
- Self-documenting through clear function names
- AI and humans both succeed
Tools Referenced:
- Structural editing: paredit, smartparens, lispy
- Real-time validation: flycheck, flymake
- Visual aids: rainbow-delimiters-mode
- CI/CD: pre-commit hooks with check-parens
This section serves as permanent reference for future Emacs Lisp
development in this repository and others.
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
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>
|
|
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>
|
|
Created emacs-inbox-zero session definition and validated it by
executing the workflow. Processed 5 inbox items to zero in 10 minutes.
Session Framework:
- Created docs/sessions/ directory for session definitions
- Added create-session.org (meta-workflow for creating sessions)
- Added emacs-inbox-zero.org (weekly inbox processing workflow)
- Updated NOTES.org with terminology and session tracking
Inbox Zero Results:
- Deleted 1 duplicate task (chime fix)
- Moved 2 to Method 1: org-capture performance [#B], EMMS keybindings [#D]
- Moved 2 to someday-maybe: dashboard icons, persistence files
- Recognized perfectionism pattern (V2MOM Obstacle #4)
Learnings captured in living documents:
- Save Q&A answers incrementally during session creation
- Capture useful context during triage (impact estimates, theories)
- Validation by execution catches what theory misses
Files reorganized:
- Renamed docs files to UPPERCASE for consistency
- Removed SESSION-HANDOFF-ACTIVE-PROJECT.org (replaced by NOTES.org)
V2MOM Metrics fulfilled:
- Weekly triage consistency: β (2025-11-01)
- Active todo count: 29 items (working toward < 20)
π€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
|
|
|
|
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.
|