| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
| |
Google's .ics export drops per-occurrence response statuses on recurring events. When OOO auto-declines a meeting, the master event keeps PARTSTAT=ACCEPTED and declined instances inherit it. The .ics path can't filter the declines out. The API path expands recurrences server-side via singleEvents=True, and each occurrence carries its own attendees[].self.responseStatus.
scripts/calendar_sync_api.py fetches events and renders them as org entries. OAuth is one-time per account. The refresh token lives at ~/.config/calendar-sync/token-<account>.json under 0600. Output matches the existing .ics shape: heading sanitization, LOCATION/ORGANIZER/STATUS/URL property drawer, HTML-stripped descriptions, org timestamps with weekday abbreviations.
I wrote 30 stdlib-unittest tests against fixture JSON, covering rendering, filtering, timestamp formatting, and HTML cleanup. I left auth and HTTP uncovered — they're thin wrappers around the Google client libraries, best checked by running the script once after OAuth setup.
docs/calendar-sync-api-setup.org walks through the Google Cloud OAuth client setup and the per-account auth bootstrap. .gitignore picks up Python bytecode now that the project has a Python helper.
The Elisp dispatch (:fetcher 'api routing in calendar-sync.el) lands in a follow-up commit.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
=make coverage= used to print a line-weighted percentage that only saw
files SimpleCov instrumented. 104 modules existed on disk but only 49
appeared in =.coverage/simplecov.json=, so the headline number was
flattering: untouched modules counted for nothing.
The summary script now adds two things on top of the existing report:
- A =Not in SimpleCov report= section listing modules present under
=modules/*.el= but absent from the SimpleCov output. Missing-module
detection is exactly direct =modules/*.el=; subdirectories and =.elc=
files are ignored.
- A =Project module coverage= line that is module-weighted across every
direct =modules/*.el= file. Tracked modules contribute their per-file
coverage percentage; missing modules contribute 0%.
The original line-weighted SimpleCov percentage stays as the
=instrumented coverage= number. The new module-weighted score is the
honest project-level reading: missing modules count as 0% without
inventing a fake executable-line denominator for them.
Tests assert the missing-module section, the new percentage, and the
ignore rules for .elc / nested files.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
modules/telega-config.el uses `:ensure nil' on the use-package block
(a stale MELPA archive index can 404 and take startup down if
auto-install runs in init). The trade-off was that a fresh clone
needed a one-time `M-x package-install RET telega' before the
dashboard launcher or `C-; G' would work -- the autoload stub
would fail with `Cannot open load file: telega' instead.
Hit it on this machine just now: dashboard pressed, autoload tried
to load telega.el, no telega.el on the load-path, cryptic error.
Add `ensure_telega_package' to the setup script: probe with
`(package-installed-p 'telega)' under `emacs --batch'; if absent,
refresh MELPA and install via package.el; if that fails, surface
the manual recovery path. Wire it into `main' after the docker
checks. Four new bats tests cover the missing-emacs, already-
installed, install-succeeds, and install-fails paths with `emacs'
stubbed at the function level.
|
| |
|
|
|
|
| |
Verifies docker is installed and the daemon is reachable, then either pulls a public image (when `TELEGA_DOCKER_IMAGE` is set) or announces the in-Emacs build path (`M-x telega-server-build`) for the user to run once. Telegram auth (phone + verification code) is interactive on first `M-x telega` and not scripted here.
Same shape as setup-email.sh: helpers are sourceable for bats, `main` runs only under direct execution. 7 bats tests stub `docker` and `command` so the suite never talks to the real daemon.
|
| | |
|
| |
|
|
|
|
| |
`setup-email.sh' ran top to bottom, so the only way to exercise `install_encrypted_password' / `decrypt_password' was to run the whole new-machine setup (mbsync, mu init). Its procedural body now lives in a `main()' function guarded by the usual `[[ "${BASH_SOURCE[0]}" == "${0}" ]]' check, so sourcing the script just defines the helpers, and running it directly is unchanged.
New `tests/test-setup-email.bats' sources the script, points the password dirs at a per-test tmpdir, and covers both helpers across the normal / skip-existing / missing-source / (for decrypt) gpg-failure paths, stubbing `gpg' so no real key is needed. `make test-bash' runs the bats files, and `make test' picks them up after the Elisp suite when bats is installed.
|
| |
|
|
| |
`setup-email.sh' was still gmail+cmail only. Added `dmail' as a first-class maildir (`~/.mail/dmail') and the work address to the `mu init' list, and reworked password bootstrap to match the live config: the gmail and dmail password files stay encrypted (mbsync/msmtp decrypt them on use), while cmail decrypts to `~/.config/.cmailpass' for ProtonBridge. A missing password source now fails loudly instead of continuing silently. `bash -n' verified. The script itself wasn't run, since it decrypts credentials, runs mbsync, and reindexes mu.
|
| |
|
|
|
|
|
| |
Replaced pandoc-based reveal.js export with native ox-reveal integration.
New org-reveal-config.el module provides offline, self-contained HTML export
with keybindings under C-; p. Includes setup script for reveal.js 5.1.0
and 34 ERT tests covering header template and title-to-filename helpers.
|
| |
|
|
|
|
|
| |
GUI key translations (M-O → M-S-o, etc.) were never installed in daemon
mode because env-gui-p returns nil at startup with no frame. Use
server-after-make-frame-hook for daemon, emacs-startup-hook otherwise.
Also adds timestamps to assemblyai-transcribe output.
|
| |
|
|
|
|
|
|
| |
- Add password decryption loop to scripts/setup-email.sh
- Decrypt .gpg files from assets/mail-passwords/ to ~/.config/
- Add encrypted password files (.gmailpass.gpg, .cmailpass.gpg)
- Fix missing paren in text-config.el that broke config parsing
- Clean up mail-config.el
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
Add removal of `emms` and `request` directories and several files to
enhance the reset-to-first-launch script to ensure complete cleanup
of user data.
|
| |
|
|
|
|
| |
Remove user confirmation and file listing prompt. Simplify the
script by directly deleting .eln and .elc files in the specified
location and confirming completion.
|
| | |
|
| |
|