summaryrefslogtreecommitdiff
path: root/todo.org
diff options
context:
space:
mode:
Diffstat (limited to 'todo.org')
-rw-r--r--todo.org305
1 files changed, 253 insertions, 52 deletions
diff --git a/todo.org b/todo.org
index 477abf9a..8c7d51b7 100644
--- a/todo.org
+++ b/todo.org
@@ -17,16 +17,25 @@ If the answer is "no" to all five → DON'T ADD IT.
V2MOM is located at: [[file:docs/emacs-config-v2mom.org][emacs-config-v2mom.org]]
Research/ideas that don't serve vision: [[file:docs/someday-maybe.org][someday-maybe.org]]
-* Method 1: Make Using Emacs Frictionless
+* Method 1: Make Using Emacs Frictionless [8/14]
+
** DONE [#A] Remove network check from startup (saves 1+ seconds)
CLOSED: [2025-10-31 Fri]
✅ Deleted blocking ping check. Startup improved from 6.2s to 5.4s.
Now uses package priorities: .localrepo (200) > online repos (25).
-** TODO [#A] Fix cj/goto-git-gutter-diff-hunks (missing function causing errors)
+** DONE [#A] Fix cj/goto-git-gutter-diff-hunks (missing function causing errors)
+CLOSED: [2025-11-03 Sun]
+
+✅ Implemented missing function in modules/vc-config.el
+- Added `cj/goto-git-gutter-diff-hunks` function (lines 118-124)
+- Uses consult-line to search for diff markers (^[+\-])
+- Enables interactive jumping to any changed line via C-; v d
+- Function properly documented with docstring
+- No linting issues, compiles cleanly
-Quick win - 15 minutes. Just needs to be defined.
+Quick win completed - 5 minutes actual time.
** DONE [#A] Fix chime-check throw with no catch block
CLOSED: [2025-11-01 Fri]
@@ -49,48 +58,112 @@ CLOSED: [2025-10-31 Fri]
Bound to C-; b D. Weekly need satisfied.
-** TODO [#B] Fix go-ts-mode-map keybinding error (void-variable)
+** DONE [#B] Fix go-ts-mode-map keybinding error (void-variable)
+CLOSED: [2025-11-03 Sun]
Error: "Debugger entered--Lisp error: (void-variable go-ts-mode-map)"
Location: modules/prog-go.el - trying to bind keys before mode loads.
-Fix: Wrap keybinding in with-eval-after-load or check if variable is bound.
+
+✅ Already fixed in commit 196b289 (Nov 2, 2025)
+- Moved keybinding from `:bind (:map go-ts-mode-map ...)` to hook function
+- Keybinding now set in `cj/go-mode-keybindings` called via `:hook`
+- Function executes after mode loads, ensuring keymap exists
+- Today's cleanup: Removed unused forward declarations (lines 34-35)
+
+Fix was: Wrap keybinding in hook function instead of :bind clause.
+Result: No more void-variable error, keybinding works correctly.
** TODO [#B] Fix org-noter (reading/annotation workflow currently "so painful")
High priority - daily pain point.
-** TODO [#B] Fix video/audio recording module (use constantly, just broke)
+** DONE [#B] Fix video/audio recording module (use constantly, just broke)
+CLOSED: [2025-11-03 Sun]
Main issue: No way to select audio devices when multiple are available.
Plugging in external audio interface broke recording - only captured input, not output.
-Use constantly, needs to work reliably.
+✅ COMPLETED - Module now has robust device detection and selection.
-*** TODO [#A] Add diagnostic command cj/recording-list-devices
-Show ALL available PulseAudio/PipeWire sources.
+*** DONE [#A] Add diagnostic command cj/recording-list-devices
+CLOSED: [2025-11-03 Sun]
+
+✅ Created `cj/recording-list-devices` command (C-; r d)
+Shows ALL available PulseAudio/PipeWire sources with drivers and states.
+Displays current configuration.
Helps debug why auto-detection fails.
-User can copy device names if needed.
-*** TODO [#A] Add device selection UI
-Prompt user to select mic and system audio sources.
-Cache selected devices for future recordings.
-Allow switching devices without restarting Emacs.
+*** DONE [#A] Add device selection UI
+CLOSED: [2025-11-03 Sun]
+
+✅ Created TWO selection workflows:
+1. `cj/recording-select-devices` (C-; r s) - Full manual control
+ - Select mic and system audio separately
+ - Interactive completion with device states
+2. `cj/recording-quick-setup-for-calls` (C-; r c) - Quick call setup
+ - Smart device pairing (groups mic + monitor by hardware)
+ - One selection for both mic and system audio
+ - Handles Bluetooth MAC normalization
+
+Devices cached in variables for future recordings.
+Can switch devices without restarting Emacs.
+
+*** DONE [#B] Improve error messages
+CLOSED: [2025-11-03 Sun]
+
+✅ Error messages now include:
+- Guidance to run `cj/recording-select-devices`
+- Clear indication when auto-detection fails
+- User-friendly prompts for manual selection
+
+*** DONE [#B] Make device detection more flexible
+CLOSED: [2025-11-03 Sun]
+
+✅ Implemented multi-level fallback system:
+1. Auto-detect using pactl output parsing
+2. Prompt user to select manually if auto-detect fails
+3. Error with helpful guidance if user declines
-*** TODO [#B] Improve error messages
-Show which devices were found/not found.
-Include actual pactl output in error messages.
-Suggest manual device configuration.
+✅ Smart device grouping in `cj/recording-group-devices-by-hardware`:
+- Handles USB, PCI (built-in), and Bluetooth devices
+- Normalizes Bluetooth MAC addresses (colons ↔ underscores)
+- Assigns friendly names (e.g., "Built-in Laptop Audio", "Bluetooth Headset")
+- Filters incomplete devices (must have both mic and monitor)
-*** TODO [#B] Make device detection more flexible
-Try multiple regex patterns for different audio setups.
-Fallback to prompting user to select from list.
-Support both PulseAudio and PipeWire.
+✅ Supports both PulseAudio and PipeWire (both use pactl).
*** TODO [#B] Validate recording startup
Check process status after starting.
Parse ffmpeg output for errors.
Show actual ffmpeg command for debugging.
+** DONE [#A] Add comprehensive test coverage for video-audio-recording module
+CLOSED: [2025-11-03 Sun]
+
+✅ Created comprehensive test suite following quality-engineer.org standards:
+- 9 test files (8 unit + 1 integration)
+- 83 test cases with 100% pass rate
+- Test categories: Normal, Boundary, Error cases
+- 6 test fixtures for reproducible testing
+- Mocking strategy using cl-letf
+- Integration test validates complete parse→group→friendly-names workflow
+- Tests document bugs in legacy detect functions
+- Critical validation: Bluetooth MAC normalization across component boundaries
+
+✅ Refactored code for testability:
+- Extracted `cj/recording--parse-pactl-output` internal parser
+- Separated I/O from business logic
+
+✅ Fixed all linting warnings (checkdoc):
+- 6 spacing/grammar issues resolved
+- `make lint` now passes cleanly
+
+✅ All changes committed and pushed to all remotes (origin + github)
+
+Commits:
+- 0a69c58: test: Add comprehensive test suite for video-audio-recording module
+- b086539: style: Fix checkdoc warnings in video-audio-recording.el
+
*** TODO [#C] Add device testing command cj/recording-test-devices
Records 3 seconds of audio.
Plays it back.
@@ -121,6 +194,52 @@ Generate transcript (once transcription workflow exists).
Daily workflow improvement.
+** TODO [#A] Fix Google Calendar password prompts every 15 minutes
+
+IRRITANT: gcal-sync triggers password prompts approximately every 15 minutes,
+interrupting workflow and breaking focus. This defeats the purpose of having
+passphrase caching configured.
+
+**Current Setup:**
+- GPG agent configured with 400-day cache (gpg-agent.conf):
+ - default-cache-ttl 34560000
+ - max-cache-ttl 34560000
+ - allow-loopback-pinentry enabled
+- Plstore caching enabled (auth-config.el:54):
+ - plstore-cache-passphrase-for-symmetric-encryption t
+ - plstore-encrypt-to nil (symmetric encryption)
+- Auth-source cache: 24 hours (auth-config.el:31)
+- Auto-sync interval: 30 minutes (org-gcal-config.el:50)
+
+**Problem:**
+Despite proper GPG agent caching, oauth2-auto.plist prompts for passphrase
+every ~15 minutes during gcal-sync operations. This suggests:
+1. plstore may not be using GPG agent cache properly for symmetric encryption
+2. oauth2-auto token refresh might be bypassing cache
+3. EPinentry mode may need explicit configuration (currently commented out)
+
+**Goal:**
+Passphrase should be entered ONCE per Emacs session, then cached until Emacs
+closes. No interruptions during normal work.
+
+**Investigation Paths:**
+1. Check if oauth2-auto respects plstore passphrase caching
+2. Investigate plstore symmetric encryption cache behavior with GPG agent
+3. Test enabling epa-pinentry-mode 'loopback (auth-config.el:42)
+4. Check oauth2-auto token refresh cycle vs password prompt timing
+5. Consider oauth2-auto configuration options for token persistence
+6. Review org-gcal or oauth2-auto issues for similar problems
+
+**Files:**
+- modules/auth-config.el (plstore and GPG configuration)
+- modules/org-gcal-config.el (org-gcal and oauth2-auto setup)
+- ~/.gnupg/gpg-agent.conf (GPG agent cache settings)
+- oauth2-auto.plist (encrypted OAuth tokens - prompts every access?)
+
+**Related:**
+This violates the "Frictionless" value - interruptions every 15 minutes during
+calendar sync breaks concentration and workflow momentum.
+
** TODO [#B] Optimize org-agenda performance using built-in profiler
THE BOTTLENECK. Currently 30+ seconds, target < 5 seconds.
@@ -131,9 +250,26 @@ Use M-x profiler-start before Method 3 debug-profiling.el is built.
15-20 seconds every time capturing a task (12+ times/day).
Major daily bottleneck - minutes lost waiting, plus context switching cost.
-** TODO [#C] Fix grammar checker performance (currently disabled)
+** DONE [#C] Fix grammar checker performance (currently disabled)
+CLOSED: [2025-11-04 Mon]
+
+✅ **Installed and configured LanguageTool for comprehensive grammar checking**
+
+Replaced disabled grammar checker with on-demand LanguageTool integration:
+- Installed LanguageTool 6.6-2 from Arch repos (222MB)
+- Created wrapper script: scripts/languagetool-flycheck (Python 3)
+- Integrated with flycheck for on-demand checking via C-; ?
+- Removed proselint (redundant - LanguageTool catches more)
+- No performance impact: only runs when explicitly invoked
+- Installation instructions added to modules/flycheck-config.el commentary
-Currently disabled because it breaks flow when writing.
+LanguageTool catches:
+- Real grammar errors (subject-verb agreement, tense, etc.)
+- Missing punctuation (commas, periods)
+- Common mistakes (could of → could have)
+- Style issues (redundant phrases, wordiness)
+
+Workflow: Open org/text/markdown file → press C-; ? → see errors in *Flycheck errors* buffer
** TODO [#D] Fix EMMS keybinding inconsistency with other buffers
@@ -141,7 +277,7 @@ EMMS keybindings conflict with standard buffer keybindings, causing mistypes.
Results in accidental destructive actions (clearing buffers), requires undo + context switch.
Violates Intuitive value - muscle memory should help, not hurt.
-* Method 2: Stop Problems Before They Appear
+* Method 2: Stop Problems Before They Appear [3/5]
** TODO [#B] Migrate from Company to Corfu
:PROPERTIES:
@@ -150,29 +286,72 @@ Violates Intuitive value - muscle memory should help, not hurt.
Complete config already exists in someday-maybe.org. Just needs to be executed.
-** TODO [#C] Switch to mood-line
+** DONE [#C] Switch to mood-line (actually: built custom modeline)
+CLOSED: [2025-11-03 Sun]
+
+✅ **Built custom modeline (better than mood-line)**
+
+Went beyond mood-line and created a fully custom modeline using only built-in
+Emacs functionality to avoid native-compilation issues. Features:
+
+**Architecture:**
+- Named segment system using defvar-local (easy to reorder)
+- Emacs 30 built-in right-alignment (mode-line-format-right-align)
+- All segments marked as risky-local-variable for proper evaluation
+
+**Interactive Features:**
+- Color-coded buffer names (green=writeable, red=read-only, gold=overwrite)
+- VC branch with git symbol () and state-based coloring
+- Mouse click handlers: buffer name (prev/next), branch (vc-diff), mode (describe-mode)
+- Help-echo tooltips on all segments
+- String truncation for narrow windows (< 100 chars wide)
+- Active-window-only display for branch and misc-info (less clutter)
+
+**Layout:**
+- Left: Major mode, buffer name, position (L:# C:#)
+- Right: Git branch, chime notifications
-Already researched. Lighter modeline.
+**Bug Fixes:**
+- Disabled async native compilation (prevented "Selecting deleted buffer" errors)
+- Fixed difftastic loading (:demand → :defer)
+- Abstracted buffer status colors to user-constants.el
-** TODO [#C] Remove deprecated tree-sitter package (rely on treesit-auto)
+Inspired by Prot's modeline design. See commit c0c4b17.
-Already have treesit-auto installed. Just remove old package.
+** DONE [#C] Remove deprecated tree-sitter package (rely on treesit-auto)
+CLOSED: [2025-11-03 Sun]
+
+✅ Removed deprecated tree-sitter package from modules/prog-general.el
+- Deleted `(use-package tree-sitter)` on line 97
+- Now relies solely on Emacs 29+ built-in treesit with treesit-auto
+- treesit-auto continues to manage tree-sitter grammars automatically
+- No functionality lost, cleaner dependency tree
-** TODO [#C] Add org-appear (show emphasis markers only when point is on them)
+** DONE [#C] Add org-appear (show emphasis markers only when point is on them)
+CLOSED: [2025-11-03 Sun]
-Cleaner org files, supports Intuitive value.
+✅ Added org-appear package to modules/org-config.el
+- Shows emphasis markers (* / _) only when cursor is on them
+- Also shows link markup and sub/superscripts when editing
+- Changed org-fontify-emphasized-text from nil to t (line 75)
+- Updated comment on line 71 to reference org-appear
+- Cleaner editing experience while maintaining visual clarity
** TODO [#C] Integrate prescient with Corfu (smart sorting)
Already using prescient with vertico. Extend to Corfu after migration.
-* Method 3: Make *Fixing* Emacs Frictionless
+* Method 3: Make *Fixing* Emacs Frictionless [1/4]
** TODO [#B] Build debug-profiling.el module
Reusable profiling infrastructure for any future performance work.
-** TODO [#C] Document localrepo limitations (treesitter grammars not included)
+** TODO [#C] Build localrepo out (package snapshot system)
+
+Repeatable installs and safe rollbacks.
+
+*** TODO [#C] Document localrepo limitations (treesitter grammars not included)
.localrepo only contains packages from package.el archives.
Treesitter grammars are downloaded separately by treesit-auto on first use.
@@ -182,15 +361,48 @@ For true offline reproducibility, need to cache treesitter grammars separately.
Complex workflow testing capability.
-** TODO [#C] Build localrepo out (package snapshot system)
+** DONE [#C] Integrate difftastic (structural diffs)
+CLOSED: [2025-11-03 Sun]
-Repeatable installs and safe rollbacks.
+✅ Completed difftastic integration:
+1. **Upgraded cj/diff-buffer-with-file to use ediff** (modules/custom-buffer-file.el)
+ - Replaced basic unified diff with ediff-current-file
+ - Now uses same ediff config (horizontal split, j/k navigation)
+ - Keybinding C-; b D now launches interactive ediff
+
+2. **Added difftastic for git diffs** (modules/vc-config.el)
+ - Installed binary: difftastic 0.64.0
+ - Added difftastic.el package integrated with magit
+ - Keybindings in magit-diff: D for dwim, S for show
+ - Provides structural, language-aware diffs for git changes
+
+Result: Better diffs everywhere - ediff for interactive buffer comparison,
+difftastic for understanding git changes.
+
+** TODO [#C] Remove orphaned dwim-shell-security tests and unused production code
+
+Why: 12 tests in test-dwim-shell-security.el fail because the functions they test
+are inside a use-package :config block (dwim-shell-config.el:101-108) that only
+loads when the dwim-shell-command package is available. During batch testing,
+the package isn't loaded, so functions are never defined (void-function errors).
-** TODO [#C] Integrate difftastic (structural diffs)
+These are PDF password protection and ZIP encryption functions that likely have
+never been used in practice - they're placeholder code from initial setup.
-Structural diffs that show semantic changes. Hook into cj/diff-buffer-with-file.
+What to delete:
+1. Test file: tests/test-dwim-shell-security.el (12 failing tests)
+2. Production functions in modules/dwim-shell-config.el (lines ~302-347):
+ - cj/dwim-shell-commands-pdf-password-protect (lines 302-324)
+ - cj/dwim-shell-commands-pdf-password-unprotect (lines 326-347)
+ - cj/dwim-shell-commands-create-encrypted-zip (search for it)
+ - cj/dwim-shell-commands-remove-zip-encryption (search for it)
-* Method 4: Contribute to the Emacs Ecosystem
+After deletion: Run "make test-all" to confirm 18 failures → 6 failures
+(only benchmark performance tests remain, which are environment-dependent).
+
+Aligns with: Reducing test failures from 18 to 6, cleaning up unused code.
+
+* Method 4: Contribute to the Emacs Ecosystem [0/4]
** TODO [#C] Set up package-lint for elisp linting (chime, org-msg, wttrin)
@@ -208,7 +420,7 @@ Zero-config CI for Emacs packages.
Measure and track test coverage over time.
-* Method 5: Be Kind To Your Future Self
+* Method 5: Be Kind To Your Future Self [0/2]
** TODO [#C] Add transcription workflow
:PROPERTIES:
@@ -221,7 +433,7 @@ Complete code already exists in someday-maybe.org. Need today and recurring.
Create reveal.js slides from org-mode.
-* Method 6: Develop Disciplined Engineering Practices
+* Method 6: Develop Disciplined Engineering Practices [0/3]
** TODO [#A] First weekly triage by Sunday (establish habit)
SCHEDULED: <2025-11-03 Sun>
@@ -238,15 +450,4 @@ Review this inbox, cancel stale items, keep < 20 active. Track in calendar.
Can't research next thing until current thing is implemented.
* Emacs Config Inbox
-** DONE [#A] Irritant: Print should be keybound to capital P
-CLOSED: [2025-11-03 Sun]
-
-Swapped keybindings:
-- C-; b p → copy file path (safe, common action)
-- C-; b P → print to PS (dramatic, requires shift)
-
-** DONE [#A] Irritant: send buffer to printer must have confirmation
-CLOSED: [2025-11-03 Sun]
-
-Added y-or-n-p confirmation to cj/print-buffer-ps.
-C-u prefix skips confirmation and prints in color.
+** TODO cj/flyspell-then-abbrev loses keybinding in scratch org-mode buffer