summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
8 daysfeat(calendar-sync): multi-calendar support with property testsHEADmainCraig Jennings
Added multi-URL calendar sync supporting Google and Proton calendars. Each calendar syncs to separate file with per-calendar state tracking. Added 13 property-based tests for RRULE expansion. Total: 150 tests passing.
2025-11-24session: Add session notes and org-noter TODOCraig Jennings
Added session notes for 2025-11-24 DWIM shell command work. Added detailed TODO for org-noter workflow continuation with known issues and testing requirements. Added TODO for dwim-shell-command status dashboard with implementation approaches.
2025-11-24feat(dwim-shell): fix M-D menu binding and enhance audio extractionCraig Jennings
- Fix dwim-shell-commands-menu keybinding in dirvish/dired - Remove :after (dired dirvish) which prevented package loading - Add :demand t to load package immediately at startup - Move keybindings inside :config block after menu function definition - M-D now works immediately in dirvish without manual trigger - Enhance extract-audio-from-video function - Fix :extensions parameter (was regex string, now proper list) - Change from copy to AAC re-encoding for codec compatibility - Add interactive bitrate selection (64k/96k/128k/192k) - Fixes Opus codec compatibility issues with M4A containers - Remove conflicting keybindings - Remove music-config p binding in dirvish (was overriding path copy) - Clean up extraneous requires/hooks from troubleshooting - Add TODO for dwim-shell-command status dashboard [#D priority] 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24refactor(keybindings): reorganize time-zones and kill-buffer-and-window bindingsCraig Jennings
Move time-zones from C-x c to M-C for easier access. Move cj/kill-buffer-and-window from M-C to C-; b k to group with other buffer operations. Updated documentation and which-key labels. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21feat(org-noter): implement custom org-noter workflowCraig Jennings
Implemented custom org-noter workflow with F6 keybinding: - Creates notes files as org-roam nodes in org-roam-directory - Title prompt with pre-slugified default, notes-on-{slug}.org format - F6 toggles notes window visibility when session active - Preserves PDF fit setting on toggle - Deferred org-roam integration to prevent PDF open hang Also fixed: quick-sdcv quit binding, calendar-sync sentinel buffer error Added 30 ERT tests for title-to-slug and template generation functions
2025-11-21chore(weather): update location listCraig Jennings
- Add Huntington Beach, CA - Reorder locations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21fix(org-noter): remove duplicate org-roam integration callCraig Jennings
- Removed duplicate org-noter-enable-org-roam-integration call - Fixed indentation in when block for pdftools integration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21fix: add quick-sdcv quit binding and fix calendar-sync sentinelCraig Jennings
- Add 'q' keybinding in quick-sdcv-mode to quit-window for easier dictionary dismissal while reading epubs - Fix "Selecting deleted buffer" error in calendar-sync by checking buffer-live-p before accessing process buffer in sentinel 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18session: Update calendar sync state and command historyCraig Jennings
- Updated gcal.org with 377 events from successful RRULE expansion - Updated sync state with latest sync timestamp - Updated command history 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18feat(dirvish): Add project clipper shortcut (pc)Craig Jennings
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18feat(calendar-sync): Add RRULE support and refactor expansion functionsCraig Jennings
Implements complete recurring event (RRULE) expansion for Google Calendar with rolling window approach and comprehensive test coverage. Features: - RRULE expansion for DAILY, WEEKLY, MONTHLY, YEARLY frequencies - Support for INTERVAL, BYDAY, UNTIL, and COUNT parameters - Rolling window: -3 months to +12 months from current date - Fixed COUNT parameter bug (events no longer appear beyond their limit) - Fixed TZID parameter parsing (supports timezone-specific timestamps) - Replaced debug messages with cj/log-silently Refactoring: - Extracted helper functions to eliminate code duplication: - calendar-sync--date-to-time: Date to time conversion - calendar-sync--before-date-p: Date comparison - calendar-sync--create-occurrence: Event occurrence creation - Refactored all expansion functions to use helper functions - Reduced code duplication across daily/weekly/monthly/yearly expansion Testing: - 68 tests total across 5 test files - Unit tests for RRULE parsing, property extraction, weekly expansion - Integration tests for complete RRULE workflow - Tests for helper functions validating refactored code - All tests passing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17feat: add org keymap under C-; O with cache clear bindingCraig Jennings
Created general org operations keymap at C-; O separate from specialized org-table and org-drill keymaps. Added C-; O c binding for clearing org-element cache to fix org-todo state change errors.
2025-11-17fix: increase calendar-sync curl timeout from 10 to 30 secondsCraig Jennings
10-second timeout was too aggressive for slower networks or delayed Google servers. Increased to 30 seconds to prevent timeout errors while still preventing indefinite hangs.
2025-11-17session: update command historyCraig Jennings
2025-11-17session: async calendar sync implementation and testingCraig Jennings
Implemented async calendar fetching to prevent UI freezes. Tested sync functionality and confirmed improved responsiveness. Updated calendar state and data files from sync testing.
2025-11-17feat(calendar-sync): Make ICS fetching asynchronousCraig Jennings
Changed calendar-sync--fetch-ics from synchronous call-process to asynchronous make-process with callback pattern. This prevents Emacs from freezing during calendar syncs. Changes: - calendar-sync--fetch-ics now takes a callback parameter - Uses make-process with sentinel for async completion - calendar-sync-now updated to use callback pattern - Fetch completes in background without blocking Emacs All 56 tests pass. User confirmed improved responsiveness. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17chore(calendar-sync): Change default interval to 60 minutesCraig Jennings
Changed default sync interval from 15 minutes to 60 minutes (1 hour). Rationale: - Calendar events typically don't change that frequently - Reduces network requests and potential blocking events - Users can still manually sync or adjust interval as needed - More conservative default that balances freshness with performance 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17refactor(calendar-sync): Make interval configurable in minutesCraig Jennings
Changed calendar-sync-interval (seconds) to calendar-sync-interval-minutes for more user-friendly configuration. Changes: - Renamed: calendar-sync-interval → calendar-sync-interval-minutes - Units: seconds → minutes (default: 15) - Internal conversion to seconds happens in calendar-sync-start - Updated docstrings and messages to reference minutes Benefits: - More intuitive configuration (users think in minutes, not seconds) - Clearer variable name indicates units - No functional change, just better UX Example usage: (setq calendar-sync-interval-minutes 30) ; Sync every 30 minutes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17feat(calendar-sync): Add auto-start toggle and convert to defvarCraig Jennings
Changes: 1. Converted defcustom → defvar (3 variables): - calendar-sync-ics-url - calendar-sync-interval - calendar-sync-file - Removed defgroup (not using customize system) 2. Added calendar-sync-auto-start variable (default: t) - Controls whether auto-sync starts when module loads - Set to nil to disable automatic startup 3. Updated initialization to check auto-start flag - Auto-sync only starts if both auto-start and URL are non-nil - Provides user control over automatic behavior Rationale: - Auto-sync is convenient but should be toggleable - defvar is simpler and more direct than defcustom - Consistent with project style (no customize interface) Default behavior: Auto-sync enabled (backwards compatible with user expectation) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17fix(calendar-sync): Remove carriage return characters from synced eventsCraig Jennings
Problem: Google Calendar .ics files use CRLF line endings (RFC 5545 spec), which resulted in 11,685 ^M (CR) characters appearing in gcal.org, particularly at the end of org header lines. Solution: - Created calendar-sync--normalize-line-endings function to strip all \r characters from .ics content - Integrated into calendar-sync--fetch-ics immediately after curl download - Ensures clean Unix LF-only line endings throughout parsing pipeline Testing: - Added comprehensive test suite: test-calendar-sync--normalize-line-endings.el - 16 tests covering Normal, Boundary, and Error cases - All 56 existing calendar-sync tests still pass (no regressions) - Verified: gcal.org now has 0 CR characters (was 11,685) Files modified: - modules/calendar-sync.el: Added normalize function, updated fetch function - tests/test-calendar-sync--normalize-line-endings.el: New comprehensive test suite 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16chore: Mark org-appear toggle task as DONECraig Jennings
Completed implementation of cj/org-appear-toggle with C-c C-a keybinding. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16chore: Updated tasksCraig Jennings
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16feat: Add toggle for org-appear mode (C-c C-a)Craig Jennings
Implemented cj/org-appear-toggle to control when emphasis markers and link URLs are revealed. Useful for editing links while keeping tables readable when long URLs would otherwise expand and break layout. Changes: - Enabled org-appear package (removed :disabled flag) - Removed auto-enable hook (default: OFF for cleaner reading) - Added cj/org-appear-toggle function with clear user feedback - Bound to C-c C-a in org-mode-map - C-c C-a was unbound (no conflict with org-attach or other commands) Usage: - Default: OFF (links and emphasis markers stay hidden) - Press C-c C-a: Turn ON (markers show when cursor is on them) - Press C-c C-a again: Turn OFF (back to hidden) Closes todo.org line 29: "Toggle org-appear on/off" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16refactor: Use cj/log-silently for debug messagesCraig Jennings
Converted debug/informational messages to use cj/log-silently instead of message across multiple modules. These are automatic initialization or background task messages that don't need minibuffer display but should still be logged to *Messages* buffer. Changes: - org-agenda-config.el: Cache build/hit messages (4 messages) - org-refile-config.el: Cache build/hit + mode switching (5 messages) - org-export-config.el: reveal.js download message (1 message) - auth-config.el: oauth2-auto cache fix message (1 message) - quick-video-capture.el: initialization message (1 message) All modules now require system-lib for cj/log-silently function. Keeps UI clean while maintaining debuggability. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16test(calendar-sync): Add unit tests for UTC conversion functionCraig Jennings
Added 5 dedicated unit tests for calendar-sync--convert-utc-to-local function that was extracted during refactoring: - test-calendar-sync--convert-utc-to-local-basic-conversion Tests standard UTC to local time conversion - test-calendar-sync--convert-utc-to-local-midnight-boundary Tests day boundary handling (UTC midnight → previous day in some timezones) - test-calendar-sync--convert-utc-to-local-preserves-minutes Verifies minute component preservation during conversion - test-calendar-sync--convert-utc-to-local-returns-five-elements Validates return format and element types - test-calendar-sync--convert-utc-to-local-end-of-day Tests near end-of-day conversion (potential rollover to next day) Test coverage increased from 51 to 56 tests, all passing. The extracted function now has both direct unit tests (isolation) and indirect integration tests (via calendar-sync--parse-timestamp). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16feat(calendar-sync): Add automatic timezone detection and chronological sortingCraig Jennings
Implemented calendar-sync.el as a complete replacement for org-gcal, featuring: **Core Functionality:** - One-way sync from Google Calendar to Org (via .ics URL) - UTC to local timezone conversion for all event timestamps - Chronological event sorting (past → present → future) - Non-blocking sync using curl (works reliably in daemon mode) **Automatic Timezone Detection:** - Detects timezone changes when traveling between timezones - Tracks timezone offset in seconds (-21600 for CST, -28800 for PST, etc.) - Triggers automatic re-sync when timezone changes detected - Shows informative messages: "Timezone change detected (UTC-6 → UTC-8)" **State Persistence:** - Saves sync state to ~/.emacs.d/data/calendar-sync-state.el - Persists timezone and last sync time across Emacs sessions - Enables detection even after closing Emacs before traveling **User Features:** - Interactive commands: calendar-sync-now, calendar-sync-start/stop - Keybindings: C-; g s (sync), C-; g a (start auto-sync), C-; g x (stop) - Optional auto-sync every 15 minutes (disabled by default) - Clear status messages for all operations **Code Quality:** - Comprehensive test coverage: 51 ERT tests (100% passing) - Refactored UTC conversion into separate function - Clean separation of concerns (parsing, conversion, formatting, sorting) - Well-documented with timezone behavior guide and changelog **Migration:** - Removed org-gcal-config.el (archived in modules/archived/) - Updated init.el to use calendar-sync - Moved gcal.org to .emacs.d/data/ for machine-independent syncing - Removed org-gcal appointment capture template Files modified: modules/calendar-sync.el:442, tests/test-calendar-sync.el:577 Files created: data/calendar-sync-state.el, tests/testutil-calendar-sync.el Documentation: docs/calendar-sync-timezones.md, docs/calendar-sync-changelog.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15docs: Add session notes for maildir corruption fixCraig Jennings
Fixed mbsync IMAP APPEND errors caused by 8 non-email files (PDFs and PNGs) in maildir folders. Removed corrupted files to recovery directory for user review. Successfully verified fix with clean mbsync run. Third occurrence of this pattern - may need investigation into attachment handling or file operations targeting maildir. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15refactor(reconcile-open-repos): Use git pull --rebase for cleaner historyCraig Jennings
Changed from merge strategy to rebase strategy when pulling updates in the multi-repo reconciliation workflow. This avoids creating unnecessary merge commits and maintains linear history. Changes: - Line 54: git pull --quiet → git pull --rebase --quiet (clean repos) - Line 64: git pull --quiet → git pull --rebase --quiet (dirty repos) Benefits: - Cleaner git history (no merge commits for simple pulls) - Consistent with best practices for personal development - Aligns with git pull --rebase --autostash used elsewhere The workflow still maintains its error handling and Magit integration for conflict resolution. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15fix(tests): Move cj/log-silently to system-lib.el, fix all test failuresCraig Jennings
Consolidated cj/log-silently function to system-lib.el as the canonical location for low-level utility functions. This fixes 4 failing tests in video-audio-recording that couldn't find the function. Changes: - Move cj/log-silently to system-lib.el (from system-utils.el) - Remove duplicate definition from org-agenda-config-debug.el - Remove duplicate definition from system-utils.el - Add (require 'system-lib) to all modules using cj/log-silently: - video-audio-recording.el - org-agenda-config-debug.el - media-utils.el (also removed declare-function) - elfeed-config.el (replaced system-utils with system-lib) - wrap-up.el Test Results: - Before: 112/113 passing (4 video-audio-recording tests failing) - After: 113/113 passing ✓ All tests now pass with zero failures. Fixes TODO #809-895 (move cj/log-silently to system-lib.el) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15fix(tests): Update mousetrap test to match current configurationCraig Jennings
The test expected 'primary-click' but the actual configuration maps dashboard-mode to 'scroll+primary' (mousetrap-mode.el line 69). Updated test to expect 'scroll+primary' to match current config. Before: Test expected primary-click (outdated) After: Test expects scroll+primary (matches config) All 11 mousetrap profile tests now passing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15feat(tests): Improve test failure reporting in MakefileCraig Jennings
Major improvements to test output clarity and failure diagnostics: Output Improvements: - Clean aligned output showing test file + pass/fail status - Show test count for passing files: "✓ (11 tests)" - Clear "✗ FAILED" marker for failures (no verbose noise) - Suppress passing test details (reduces output by ~95%) Failure Summary: - Clear visual separator box for failures - List all failed files with bullet points - Show specific failed test names with line numbers - Provide copy-paste commands to re-run failures Technical Changes: - Capture test output and only display on failure - Extract test count from ERT output for passing tests - Save failure details to temp files for summary - Apply same improvements to both unit and integration tests Benefits: - Instantly see which tests failed (no scrolling) - Know exactly which test names failed - Get line numbers for debugging - Copy-paste commands to re-run specific failures - Dramatically reduced output verbosity Example summary: Failed test files: • test-mousetrap-mode--get-profile-for-mode.el Errors: FAILED test-foo (line 15) Run individual failing tests with: make test-file FILE=test-mousetrap-mode--get-profile-for-mode.el 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15feat(music): Switch EMMS from MPD to MPV backendCraig Jennings
Major improvements to music player configuration: Backend Changes: - Switch from emms-player-mpd to emms-player-mpv - Remove MPD daemon dependency (no service management required) - Configure MPV with --quiet, --no-video, --audio-display flags - Support both local files and streaming URLs (http/https/mms) Keybinding Enhancements: - Add C-; m n → next track - Add C-; m p → previous track - Add C-; m g → go to playlist - In playlist: n/P for next/prev, f/b for seek forward/backward - Update which-key descriptions Code Quality: - Use music-dir constant from user-constants.el (not hardcoded path) - Add (require 'user-constants) for proper dependency - Update commentary to reflect MPV backend Test Fixes: - Fix 8 failing append-track tests - Update test mock data to use cj/music-root for portability - All 104 music-config tests now passing Benefits: - No daemon to start/stop/manage - Simpler architecture (one process vs MPD+EMMS) - Streaming radio URLs work out of the box - Better path consistency across codebase 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15refactor(dirvish): Rename project shortcuts for consistencyCraig Jennings
- Rename "pD" to "pdx" for ~/projects/documents/ - Rename "pd" to "pdl" for ~/projects/danneel/ Uses consistent naming: pdx (documents), pdl (danneel), pl (elibrary), pf (finances), pjr (jr-estate). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15feat(dirvish): Add dropbox shortcut and fix directory pathsCraig Jennings
- Add "db" shortcut for ~/documents/dropbox/ - Update "lx" path from ~/lectures/ to ~/archive/lectures/ - Rename "sv" to "spv" and update path to ~/sync/phone/videos/ - Fix "tg" path to use org-dir instead of sync-dir All shortcuts now point to existing directories. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15feat(dashboard): Comprehensive dashboard navigation improvementsCraig Jennings
- Add single-key navigation (e, c, a, b, f, r, i, t, d) for all dashboard items - Add new navigator buttons: Code (projects), Agenda, Terminal - Reorganize buttons into two balanced rows (5 top, 4 bottom) - Remove bracket decoration around buttons for cleaner look - Add proper spacing between buttons for better readability - Rename labels: "Feeds" → "RSS/Feeds", "Files" → "Directory/Files" - Disable package count and startup time display - Disable 'q' keybinding to prevent accidental dashboard quit Navigator buttons now include: Row 1: Code, Email, Agenda, Flashcards, Books Row 2: RSS/Feeds, IRC, Terminal, Directory/Files 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15fix(modeline): Align to window edge instead of buffer marginCraig Jennings
Change mode-line-right-align-edge from 'right-margin to 'window. This fixes an issue where centered text modes (nov-mode for EPUBs, etc.) with wide buffer margins would cause the right-aligned modeline elements (VC branch, weather, etc.) to have large gaps on the right side. Now the modeline always aligns to the window edge regardless of buffer margin settings. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15fix(mousetrap): Fix dashboard click/scroll blocking issueCraig Jennings
- Change dashboard profile from primary-click to scroll+primary (allows both scrolling and left-clicking in dashboard) - Remove incorrect manual manipulation of minor-mode-map-alist (define-minor-mode handles this automatically via mouse-trap-mode-map) - Simplify disable logic to just clear the buffer-local keymap The bug was that manually prepending to minor-mode-map-alist interfered with Emacs' automatic buffer-local keymap lookup. Now each buffer gets its own keymap based on major mode, and Emacs handles the lookup correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15chore: Update Emacs historyCraig Jennings
Updated minibuffer and command history from recent session. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15feat(scratch): Set scratch buffer font to 16pt and fix missing variableCraig Jennings
- Add missing scratch-greet variable definition - Set scratch buffer font height to 16pt for better readability - Fix buffer targeting using with-current-buffer for reliability - Simplify scratch greeting message 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15feat(epub): Improve nov reader typography and layoutCraig Jennings
- Reduce variable-pitch font from 1.8x to 1.0x for normal reading size - Add configurable margin percentage (cj/nov-margin-percent, default 25%) - Calculate text width dynamically based on window size and margins - Text now uses 50% of window width with 25% margins on each side 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14test: Add integration test for recording monitor captureCraig Jennings
2025-11-14chore: updated tasksCraig Jennings
2025-11-14fix(recording): Fix phone call audio capture with amix filterCraig Jennings
Phone calls were not capturing the remote person's voice due to severe volume loss (44 dB) when using the amerge+pan FFmpeg filter combination. Changes: - Replace amerge+pan with amix filter (provides 44 dB volume improvement) - Increase default system volume from 0.5 to 2.0 for better capture levels - Add diagnostic tool to show active audio playback (C-; r w) - Add integration test with real voice recording - Fix batch mode compatibility for test execution The amix filter properly mixes microphone and system monitor inputs without the massive volume loss that amerge+pan caused. Verified with automated integration test showing perfect transcription of test audio. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14fix: Reapply dashboard, weather config fixes and todo updatesCraig Jennings
- dashboard-config.el: Change "Ebooks" to "Books" label - weather-config.el: Fix variable name to wttrin-favorite-location - todo.org: Add music player and mousetrap investigation tasks - history: Update command history 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14Revert "checking in modified/removed tests and other misc changes"Craig Jennings
This reverts commit 9d55ed149e100b4fb3ef6f5a79d263dcb26ce835.
2025-11-14checking in modified/removed tests and other misc changesCraig Jennings
2025-11-14fix(ui): Fix cursor color updates with post-command-hookCraig Jennings
The cursor color was not updating correctly when switching buffers or modifying files. The original implementation used window-buffer-change and other specific hooks, but these were insufficient and internal buffers were interfering with cursor color updates. Root cause: - Cursor color is global (one cursor for all of Emacs) - Previous hooks fired in internal buffer contexts (*Echo Area*, *temp*) - This caused cursor to be set to white (unmodified) even when in read-only buffers like dashboard Solution: - Use post-command-hook which runs after every command in current buffer - Ignore internal buffers (names starting with space) - Cache optimization prevents redundant set-cursor-color calls Behavior now: - Dashboard (read-only): Red cursor - Unmodified file: White cursor - Modified file: Green cursor - After save: White cursor Tests: - Added 9 integration tests in test-ui-cursor-color-integration.el - Tests verify hook installation, buffer switching, modification tracking - All 27 tests passing (18 unit + 9 integration) Integration tests catch issues that unit tests miss: - Unit tests verified state detection logic (✓) - Integration tests verify hooks fire at right times (✓ now) - Integration tests verify real buffer switching behavior (✓ now) Cleanup: - Removed debug code from init.el - Removed debug-cursor-color.el temporary file 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14feat(ui): Add buffer modification state to color indicatorsCraig Jennings
Change modeline filename and cursor colors to indicate buffer modification status, not just read-only/overwrite state. Color scheme changes: - White (#ffffff): Unmodified writeable buffer - Green (#64aa0f): Modified writeable buffer (unsaved changes) - Red (#f06a3f): Read-only buffer - Gold (#c48702): Overwrite mode active Previously: All writeable buffers were green regardless of modification Now: White when clean, green when dirty (better visual feedback) Implementation: - Updated cj/buffer-status-colors in user-constants.el: - Changed 'normal' → 'unmodified' (white) - Added new 'modified' state (green) - Updated state detection in modeline-config.el: - Now checks (buffer-modified-p) before defaulting to unmodified - Updated cursor color logic in ui-config.el: - Same state detection as modeline for consistency - Added after-change-functions hook for real-time updates - Added after-save-hook to update on save Priority order (highest to lowest): 1. Read-only (red) - takes precedence over everything 2. Overwrite mode (gold) - takes precedence over modified state 3. Modified (green) - buffer has unsaved changes 4. Unmodified (white) - default for clean writeable buffers Tests: - 18 comprehensive tests in test-ui-buffer-status-colors.el - Tests state detection logic and priority order - Tests color constant definitions and mappings - Tests integration with cursor and modeline - All tests passing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14feat(mousetrap): Add profile-based architecture and clickable lighterCraig Jennings
Implement comprehensive profile-based system for selective mouse event control with dynamic lighter and interactive toggling. Features: - Profile-based architecture (7 profiles: disabled, scroll-only, primary-click, scroll+primary, read-only, interactive, full) - Mode-specific configuration (dashboard, pdf-view, nov) - Dynamic keymap building based on current major mode - Clickable modeline lighter (🐭 when off, 🪤 when on) - Dynamic reconfiguration without Emacs reload - Mode inheritance support via derived-mode-p Profiles define which event categories are allowed: - primary-click: Left mouse button only - secondary-click: Middle and right buttons - drags: Drag selections - multi-clicks: Double and triple clicks - scroll: Mouse wheel/trackpad scrolling Default configuration: - dashboard-mode: primary-click (left-click only) - pdf-view-mode: full (all events) - nov-mode: full (all events) - Other modes: disabled (all events blocked) Tests: - 66 comprehensive tests across 5 test files - Unit tests for profile lookup and keymap building - Integration tests for mode switching and dynamic config - Lighter functionality and click interaction tests - All tests passing Known issue: - Dashboard-mode clicks blocked despite primary-click profile - Documented in todo.org for investigation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-13feat(mousetrap): Add configurable mouse wheel scrollingCraig Jennings
Added `mouse-trap-enable-scrolling` variable to allow mouse wheel scrolling while still blocking clicks and drags. Defaults to enabled for better usability - users can still scroll with mouse/trackpad but accidental clicks are prevented. - Added defvar mouse-trap-enable-scrolling (default: t) - Conditionally bind wheel events based on variable - Updated docstrings to reflect new behavior - Works for both mouse wheel and trackpad two-finger scrolling 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>