summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
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>
2025-11-12fix: Write relative paths to M3U playlists instead of absoluteCraig Jennings
Changed cj/music--append-track-to-m3u-file to convert absolute paths to relative paths from cj/music-root before writing to M3U files. This fixes playlist loading in Mopidy, which expects relative paths in M3U files based on the configured base_dir. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12feat(fonts): Update fonts to Berkeley Mono + Lexend, simplify org-drill configCraig Jennings
Font changes: - Set Berkeley Mono + Lexend as default fonts - Updated EBook preset to use Lexend - Created FiraCode preset preserving old defaults - Installed new fonts: Charis SIL, Bitstream Vera, Literata, Lexend Org-drill changes: - Removed fontaine-dependent font switching code - Now uses org-drill's built-in display management - Configured 24-point font, variable-pitch, hidden modeline - Added comprehensive tests for display management (10 tests, all passing) org-drill now loads from local ~/code/org-drill for development. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12chore: Update history fileCraig Jennings
πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12feat(fonts): Update default fonts to Berkeley Mono + LexendCraig Jennings
Changed default fontaine preset to use Berkeley Mono for fixed-pitch and Lexend for variable-pitch reading. Lexend is specifically designed to improve reading fluency and reduce visual stress for long-form reading. Changes: - Default preset: Berkeley Mono + Lexend - New FiraCode preset: Preserves old defaults (FiraCode + Merriweather) - New BerkeleyMono preset: Berkeley Mono + Charis SIL - Installed fonts: Charis SIL, Bitstream Vera, Literata, Lexend πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12docs: Add comprehensive test-reporter specificationCraig Jennings
Created detailed specification for test reporting system that will: - Parse ERT batch output and generate test summaries - Show total tests, passed, failed, duration - List individual test failures with details - Enable incremental improvement via TDD Key Design Decisions: - Language: Emacs Lisp (dogfooding, no dependencies, better integration) - Architecture: Collect β†’ Parse β†’ Report - Integration: Makefile + test-runner.el - Test isolation: Clear tests on project switch Implementation Phases: - Phase 1: Basic stats (tests, passed, failed, duration) - Phase 2: Failure details (messages, rerun commands) - Phase 3: Rich details (timing, slowest tests, assertions) Cross-Project Test Isolation: - Problem: ERT tests globally registered across all projects - Solution: Clear tests on project switch + project-aware commands - Hybrid approach combining automatic and manual control Integration Points: - Makefile: Pipe output to test-reporter script - test-runner.el: Post-run hooks or result wrapping - ERT: Custom reporter (future enhancement) Test-Driven Development: - Parser tested with real ERT output samples - Fixtures for edge cases - Incremental improvement as new formats encountered This is marked as NEXT PRIORITY TASK. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12refactor: Remove ANSI color codes from MakefileCraig Jennings
Replaced colored output with plain text symbols for better portability: - Removed all COLOR_* variable definitions - Replaced color-wrapped text with plain text - Added simple text markers: - [i] for informational messages - [!] for warnings - βœ“ for success (kept from before) - βœ— for errors (kept from before) - ⚠ for warnings (kept from before) Benefits: - Works in all terminals and CI environments - No escape code littering when piped or logged - Simpler, more maintainable code - Cleaner output that's easier to read Changes: 40 insertions, 45 deletions πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12perf: Merge performance branch - org-agenda cache, tests, and inbox zeroCraig Jennings
This squash merge combines 4 commits from the performance branch: ## Performance Improvements - **org-agenda cache**: Cache org-agenda file list to reduce rebuild time - Eliminates redundant file system scans on each agenda view - Added tests for cache invalidation and updates - **org-refile cache**: Optimize org-refile target building (15-20s β†’ instant) - Cache eliminates bottleneck when capturing tasks ## Test Suite Improvements - Fixed all 18 failing tests β†’ 0 failures (107 test files passing) - Deleted 9 orphaned test files (filesystem lib, dwim-shell-security, org-gcal-mock) - Fixed missing dependencies (cj/custom-keymap, user-constants) - Fixed duplicate test definitions and wrong variable names - Adjusted benchmark timing thresholds for environment variance - Added comprehensive tests for org-agenda cache functionality ## Documentation & Organization - **todo.org recovery**: Restored 1,176 lines lost in truncation - Recovered Methods 4, 5, 6 + Resolved + Inbox sections - Removed 3 duplicate TODO entries - **Inbox zero**: Triaged 12 inbox items β†’ 0 items - Completed: 3 tasks marked DONE (tests, transcription) - Relocated: 4 tasks to appropriate V2MOM Methods - Deleted: 4 duplicates/vague tasks - Merged: 1 task as subtask ## Files Changed - 58 files changed, 29,316 insertions(+), 2,104 deletions(-) - Tests: All 107 test files passing - Codebase: Cleaner, better organized, fully tested πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11perf: Optimize org-refile with caching to eliminate 15-20s delayCraig Jennings
Implemented comprehensive caching solution for org-refile targets that eliminates repeated filesystem scans (34,649 files) on every refile operation. Performance Impact: - Before: 15-20 seconds per refile Γ— 12+/day = 3-4 minutes daily - After: Instant (<50ms) via cache, async build in background - Daily time saved: ~3-4 minutes + eliminated 12+ context switches Root Cause: - cj/build-org-refile-targets scanned all files in 3 directories: * ~/.emacs.d (11,995 files) * ~/code (18,695 files) * ~/projects (3,959 files) - Called on EVERY refile via cj/org-refile - directory-files-recursively is expensive with deep hierarchies Solution Implemented: 1. Cache layer with 1-hour TTL - First call: builds and caches targets (one-time cost) - Subsequent calls: use cache (instant) - Auto-refresh after 1 hour or Emacs restart 2. Async cache building - Runs 5 seconds after Emacs idle (non-blocking) - Zero startup impact - Cache ready before first use in typical workflow 3. Manual refresh available - M-x cj/org-refile-refresh-targets - Use after adding new projects/todo.org files - Force rebuild bypasses cache 4. Robust error handling - Building flag prevents concurrent builds - unwind-protect ensures flag always clears - Graceful handling if user refiles before async build completes Changes: - modules/org-refile-config.el: * Added cache variables with TTL support * Modified cj/build-org-refile-targets for caching * Added cj/org-refile-refresh-targets for manual refresh * Async build via run-with-idle-timer * Enhanced commentary documenting performance - tests/test-org-refile-build-targets.el (NEW): * 9 comprehensive ERT tests * Coverage: normal, boundary, error cases * Tests cache logic, TTL, force rebuild, async flag * All tests pass, zero regressions Test Results: - 9/9 new tests passing - 1,814 existing tests still passing - Zero regressions introduced πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11a/v recording: fix setup, add test functionality and indicatorlkgCraig Jennings
Integrates a modeline indicator to display active recording status in Emacs. The indicator shows "πŸ”΄Audio", "πŸ”΄Video", or "πŸ”΄A+V" based on the active recording processes. Includes functions for starting and stopping audio/video recordings, with sentinel processes ensuring timely updates to the modeline. Also adds extensive integration tests to validate modeline synchronization.
2025-11-11chrono-tools: integrate and test time-zones packageCraig Jennings
Replaced the world-clock configuration with the new time-zones package to provide an interactive world clock with fuzzy search and time shifting features. The previous world-clock code is commented out for potential fallback testing.
2025-11-11vc-config: add git clone from clipboard URL featureCraig Jennings
Introduce `cj/git-clone-clipboard-url` function for quick cloning of git repositories using a URL from the clipboard. Allows for directory selection using prefix arguments and opens the README file post-cloning if available. Adjust keymaps to include the new function and refine version control menu organization.
2025-11-11org-drill-config: enhance org-drill display settingsCraig Jennings
Added display customization for org-drill cards, including larger text and proportional font. Adjusted session limits to 100 cards and 30 minutes. Integrated a hook to apply these changes during drill sessions. Updated org-drill package configuration to use the newest revision from the main branch.
2025-11-11fix: Resolve Google Calendar password prompts via adviceCraig Jennings
Fixed oauth2-auto.el caching bug using Emacs advice system (survives updates). Root Cause: - oauth2-auto version 20250624.1919 has `or nil` on line 206 - This completely disables the internal hash-table cache - Every org-gcal sync requires decrypting oauth2-auto.plist from disk - GPG passphrase prompted every ~15 minutes (violated "Frictionless" value) The Fix (via advice): - Created cj/oauth2-auto--plstore-read-fixed with cache enabled - Applied as :override advice to oauth2-auto--plstore-read - Survives package updates (unlike direct modification) - Can be easily removed if upstream fixes the bug Changes: - modules/auth-config.el: * Added cj/oauth2-auto--plstore-read-fixed (lines 75-93) * Applied advice on package load (lines 96-98) * Added cj/clear-oauth2-auto-cache helper * Documented fix in commentary (lines 16-22) - todo.org: Mark #A priority task as DONE - docs/oauth2-auto-cache-fix.md: Detailed documentation Result: - Passphrase prompted ONCE per Emacs session (on cold start) - Subsequent org-gcal syncs use cached tokens (no prompts) - Workflow now frictionless as intended - Fix persists across package updates Upstream: - Bug acknowledged in code: "Assume cache is invalidated. FIXME" - Should report to: https://github.com/rhaps0dy/emacs-oauth2-auto - Simple fix: Remove `or nil` on line 206 πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10config: Increase chime modeline lookahead and tooltip displayCraig Jennings
Expanded chime modeline settings for better event visibility: - Lookahead window: 3 hours β†’ 6 hours - Tooltip max events: 10 β†’ 20 - Tooltip lookahead: 6 days β†’ 7 days (full week) Provides more advance notice of upcoming events and better weekly overview. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09updating tasksCraig Jennings
2025-11-09test: Add slow tag to benchmarks taking too longCraig Jennings
Disabled benchmarks for learning and tokenizing 10,000 words due to prolonged execution times (minutes instead of seconds). Added `:slow` tag to indicate need for performance optimization before re-enabling.
2025-11-09refactor:weather-config: streamline wttrin configurationCraig Jennings
Demand wttrin loading for immediate mode-line initialization at startup. Switch to setopt for customizable variables and simplify mode activation logic. Remove explicit autoload and use-package xterm-color as a dependency. Adjust refresh interval and update default locations list.
2025-11-09test: Exclude slow tests from batch executionsCraig Jennings
Update the test commands to skip tests tagged with :slow during batch execution, improving testing efficiency.
2025-11-09feat:chime: Add calendar URL configurationCraig Jennings
Set the calendar URL in chime configuration for better integration with Google Calendar. Debug mode remains available but disabled by default.
2025-11-09chore:popper-config: disable popper and comment out MessagesCraig Jennings
Disable the use-package for popper and comment out the *Messages* buffer in the popper-reference-buffers list to prevent popper from managing it.
2025-11-09doc:ai-prompts: Add guide on refactoring for testabilityCraig Jennings
Introduce new section in 'quality-engineer.org' detailing how to refactor code to enhance testability. Emphasizes recognizing deep nesting, long functions, and overmocking as refactoring signals. Provides strategies such as extracting functions and clear separation of concerns. Offers real-world examples and guidelines on effective mocking to maintain tests that are resilient to implementation changes. Enhanced content in 'coder.org' with deeper insights into handling deep nesting scenarios.
2025-11-09feat:system: Add system utility library with executable checkCraig Jennings
Introduce a new `system-lib.el` module providing low-level system utility functions, including function `cj/executable-exists-p` to check for the availability of programs in PATH. Integrate this library in `init.el`. test(system): Add unit tests for executable check function Create comprehensive unit tests for `cj/executable-exists-p` in `system-lib.el`, ensuring coverage of normal, boundary and error scenarios.
2025-11-09feat:buffer-diff: Add syntax-aware buffer diffing with difftasticCraig Jennings
Introduce enhanced buffer comparison with saved file using difftastic for syntax-aware diffing, with a fallback to regular unified diff if difftastic is unavailable. Output is displayed in separate buffers, leveraging ansi-color for improved readability. Also includes comprehensive integration tests covering the diff workflow, handling cases like added, removed, and modified lines, and ensuring graceful handling of special cases and errors.