aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* fix(tmux): pipe M-w copies to the system clipboard via wl-copyCraig Jennings2026-05-181-4/+7
| | | | | | | | | `copy-selection' writes only to tmux's internal paste buffer, so a paste in any other app got stale content. Switch the M-w binding to `copy-pipe-no-clear "wl-copy"' (same engine as the existing y binding, minus the -and-cancel so M-w stays in copy-mode for repeated grabs). The selection stays visible after copy to make multi-range copying easier to follow.
* feat(tmux): mirror vterm-copy-mode key story in tmux copy-modeCraig Jennings2026-05-181-2/+10
| | | | | | | | | | | M-w copies and stays in mode so multiple selections can be grabbed in a row (was copy-selection-and-cancel). C-g exits (was clear-selection). Enter is unbound so RET has no copy-and-exit shortcut. q and Escape already cancel by default and are kept as-is. Mirrors the cj/vterm-tmux-history and vterm-copy-mode story on the Emacs side, so all three surfaces for lifting text out of a vterm share one key story.
* fix(archsetup): handle stow-created ~/.emacs.d when cloning dotemacsCraig Jennings2026-05-172-3/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The 2026-05-16 VM run surfaced `setting up emacs configuration files (error code: 128)` with `fatal: not a git repository`. Root cause: `dotfiles/common/.emacs.d/calendar-sync.local.el` lives in the stow tree, so by the time the dotemacs clone step runs, `~/.emacs.d/` already exists with a stowed symlink inside. The previous two-branch check `[ -d "$emacs_dir" ]` then took the `git pull` path and failed because the dir isn't a git checkout. I replaced the check with three branches: - `.git` exists → `git pull --recurse-submodules` (the existing upgrade path). - Dir missing or empty → `git clone --recurse-submodules` (the fresh install path). - Dir exists with content but no `.git` (the stow case, today's bug) → `git init` + `remote add origin` + `fetch --recurse-submodules` + `checkout -B main origin/main` + `submodule update --init --recursive`. This pulls the tree in on top of the stowed file without losing it. The one-line `[ -d ]` → `[ -d .git ]` fix wouldn't have been enough on its own: the clone branch would still fail because `git clone` refuses a non-empty target. `bash -n archsetup` is clean. The VM test run that surfaced the bug exercised the old two-branch path. The new third branch wants a fresh `make test` to verify before this lands on a real machine. todo.org picks up two things this commit touches. The stale gitrepos.sh reference under "Remove/template personal info from scripts" comes out. A new sub-TODO under `[#B] Fix install errors` expands the existing tidaler item: the same "AUR exit 0 logged as error" pattern now hits six packages instead of one (tidaler, mkinitcpio-firmware, speedtest-go-bin, rar, masterpdfeditor, zsh-fast-syntax-highlighting-git). The recommendation points at `aur_install` and the error-summary aggregator as trace targets.
* fix(testing): cleanup traps, arg validation, and two real bugsCraig Jennings2026-05-179-48/+146
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Two real bugs and a sweep of hygiene across the harness. `make test` passed cleanly on this branch with the same 52/0/5 profile as the 2026-05-11 run, so the wiring is verified end-to-end. Real bugs: - `lib/vm-utils.sh` `snapshot_exists` was running `qemu-img snapshot -l | grep -q "$snapshot_name"`, which matches the name as a substring anywhere in the output — including inside dates or filenames in other fields. Replaced with an awk field extraction on the TAG column plus `grep -Fxq` for a whole-line literal match. - `run-test-baremetal.sh` was setting `VALIDATION_PASSED=true|false` after validation, but `validation.sh` already uses `VALIDATION_PASSED` as a pass counter. The test report then referenced `$VALIDATION_PASSED_COUNT`, which is defined nowhere. Renamed the boolean to `TEST_PASSED` (matching run-test.sh's pattern) and report the actual counter. Cleanup traps and arg validation: - `run-test.sh` now installs a top-level EXIT trap that, on abort, kills QEMU and restores the clean-install snapshot. A `CLEANUP_DONE=1` sentinel keeps the existing normal-path cleanup from double-firing. This is the recurring pain from 2026-05-11 where two failed runs left orphaned QEMU processes and dirty base disks behind. - `create-base-vm.sh` and `debug-vm.sh` got the same kind of trap, plus `debug-vm.sh` now rejects non-`.qcow2` paths up front instead of letting QEMU fail later. - `run-test.sh`, `run-test-baremetal.sh`, and `cleanup-tests.sh` now validate that options with required values actually receive one (`${var:?msg}` for `--script`/`--snapshot`/`--host`/`--password`, numeric check for `--keep`). - `run-test-baremetal.sh` traps the temp git bundle for cleanup if the script aborts before its explicit `rm`. The ZFS rollback loop now uses `while IFS= read -r ds` and quotes `$ds` inside the ssh_cmd so dataset names with whitespace wouldn't break it. Smaller hygiene: - `vm-utils.sh` `check_ovmf` also checks `OVMF_VARS_TEMPLATE`; `start_qemu` validates disk and ISO paths before building the QEMU command; numeric tests quoted. - `cleanup-tests.sh` find expression for temp disks wrapped in `\( ... -o ... \)`, all `while read` loops use `IFS= read -r`, orphaned QEMU cleanup tries SIGTERM with a 2s sleep before SIGKILL. - `create-base-vm.sh` moved the "Copy an archangel-*.iso" info line before its `fatal` instead of after (unreachable), and added the serial-log path to the final summary. - `lib/logging.sh` `stop_timer` no longer produces `$((end - ))` when the named timer was never started. - `lib/network-diagnostics.sh` `read` → `IFS= read -r`. - `setup-testing-env.sh` now installs all missing pacman packages in one transaction instead of one-at-a-time (avoids half-installed state if package N fails). KVM check also verifies the user has read+write on `/dev/kvm` and prints the `gpasswd -a $(id -un) kvm` fix if not. A few items from the review I deliberately skipped: replacing the codebase-wide unquoted `$SSH_OPTS` string with an array (cosmetic, would need to be done everywhere at once), `set -e` adds where the existing fall-through-on-failure is intentional, and a `--force` gate on `create-base-vm.sh` (would break the expected workflow).
* refactor(scripts/games): array + loop, flathub remote check, failure summaryCraig Jennings2026-05-171-29/+50
| | | | | | | | | | | | | | | | | | | | Three things were wrong with the old script: - One line had a duplicate `flathub` argument (`flatpak install ... flathub flathub org.gnome.Crosswords`). Flatpak tolerated it; still a typo. - Nothing added the flathub remote, so a fresh machine without it would fail on every line. - 24 nearly identical `flatpak install` lines with no central handling if one app failed. I moved the app IDs into a single `APPS=()` array (sorted) and looped. The script now runs `flatpak remote-add --if-not-exists --user flathub https://flathub.org/repo/flathub.flatpakrepo` up front, collects any failed apps into a `failed` array, and prints a summary plus a non-zero exit at the end if anything didn't install. I used `set -uo pipefail` rather than `-euo` on purpose so a single failed install doesn't abort the rest of the run.
* fix(cmail-setup-finish): verify both Bridge ports and dump status on failureCraig Jennings2026-05-171-2/+8
| | | | | | | | | | | | | | The "verifying Bridge is listening" check used a regex `127\.0\.0\.1:(1143|1025)` against `ss -ltn` output. That matches if *either* port is listening, but the success message claims both are. So a half-broken Bridge (IMAP up, SMTP down or vice versa) would pass the check. I split the check into two greps and report which port is missing. When the check fails, the script now also prints the last 10 lines of `systemctl --user status protonmail-bridge` to stderr so the operator sees the service state immediately instead of being told to go run the command themselves.
* refactor(scripts/post-install): consolidate gitrepos.sh and harden the scriptCraig Jennings2026-05-173-52/+73
| | | | | | | | | | | | | | | | | | | | | | | | gitrepos.sh did the same `~/.dotfiles` / `~/.emacs.d` remote swap that post-install.sh already had, plus a `git pull --set-upstream origin main` follow-on that post-install was missing. I folded the pull into the post-install remote-rewrite block and dropped gitrepos.sh. While in the file, I also: - Quoted every variable (`"$logfile"`, `"$HOME"` paths, `"$(whoami)"`). - Sent the remote-rewrite block to the log file like the other blocks do (was leaking to stdout). - Made the remote-rewrite idempotent. A re-run used to break the `cd && remote remove && remote add` chain because remove fails when origin is already the desired URL. The loop now uses `git -C "$dir" remote set-url` when origin exists and `remote add` when it does not. - Pre-created `~/sync`, `~/pictures`, `~/code`, `~/projects` so the clones don't fail on missing parent dirs. - Wrapped each `git clone` in a `clone_if_missing` helper so a re-run skips destinations that already exist instead of erroring out. README.md picks up the gitrepos.sh removal in the forking note.
* chore(scripts): drop dead and superseded scriptsCraig Jennings2026-05-165-101/+0
| | | | | | | | | | | | | | | | | Audit pass: each of these had no references anywhere in the repo (excluding self-references and review notes). - wip-bootcandy.sh — "wip" prefix, non-executable. Comments mention a boot animation but the script only installs ly and disables getty@tty2. - protonmail-bridge.sh — `pacman_install protonmail-bridge` (the package landed in extra) plus cmail-setup-finish.sh now cover this. - wireguard-proton.sh — hardcoded USGA tunnel and a relative `../assets/wireguard-config/*.conf` path that depends on the caller's pwd. - create-archiso-zfs.sh — one-off ISO build snippet, non-executable. - scripts/testing/lib/finalize-base-vm.sh — libvirt-era leftover. The test stack moved to direct QEMU and nothing sources or calls it.
* Update En Croissant AppImage pinCraig Jennings2026-05-161-2/+2
|
* Install setup-chess prerequisites automaticallyCraig Jennings2026-05-162-77/+520
|
* chore(todo): bump GitHub-prep subtask priorities to ACraig Jennings2026-05-151-14/+14
|
* chore: close out dotfile-separation spec reviewCraig Jennings2026-05-151-1/+5
|
* docs(plan): fold review decisions into dotfile-separation specCraig Jennings2026-05-141-30/+60
| | | | | | | | | | | | | | | I locked the URL (https://git.cjennings.net/dotfiles.git), the bare repo path (/var/git/dotfiles.git), and the Phase 1 scope. Added environment.d/envvars.conf (rofi path stripped) and systemd/user/emacs.service to the minimal/ tree. Promoted the DESKTOP_ENV=none VM test from optional to required. Made Phase 2's clone explicit (sudo -u, not chown-after). Tightened Phase 3's order so unstow and restow happen without a Hyprland reload between them. Added a note that the new dotfiles repo can't go on GitHub until the secrets cleanup ships, plus the post-install update flow in Step 3.3. Replaced the "Before starting" question block with a Status table since all five open questions are now resolved.
* chore(hyprland): capture pypr output to a per-session log fileCraig Jennings2026-05-141-1/+1
| | | | | | | Pypr was sending stderr to /dev/null. So when its keybind clients emitted red `hyprctl notify` banners after the daemon got stuck, there was no trace to read. I followed the waybar / dunst / hypridle / gammastep pattern already in the same exec-once block.
* feat(profile.d): name Claude Code remote-control sessions by host and cwdCraig Jennings2026-05-141-0/+15
| | | | | | | | | | | | | I added a shell function that wraps `claude` and exports CLAUDE_REMOTE_CONTROL_SESSION_NAME_PREFIX as "<short-hostname>/<cwd-basename>" on every call. The prefix shows up in FleetView and `claude agents` so I can tell sessions apart when several are open across projects and hosts. I picked a function over a plain .zshrc export because $PWD has to re-evaluate each call, not once at shell init. I picked it over an alias because the function form is greppable and reads cleanly in `type` output. Only affects Remote Control mode. Plain interactive `claude` is unchanged.
* docs: add dotfile-separation spec with phased implementation planCraig Jennings2026-05-132-0/+370
| | | | Covers extracting dotfiles/ into a standalone repo, adding a minimal/ stow target for headless installs, and a three-phase plan with commit boundaries. todo.org tracks the review as a sub-task.
* feat(cmail): clean autostart stub and add DNS-wait drop-inCraig Jennings2026-05-132-5/+191
| | | | | | | | I extended cmail-setup-finish.sh with two boot-cleanliness fixes for the systemd --user Bridge service. The autostart cleanup removes ~/.config/autostart/Proton Mail Bridge.desktop, which double-launches Bridge and throws an "orphan instance" dialog every login. The wait-for-dns drop-in installs an ExecStartPre loop that waits up to 30 seconds for DNS before Bridge's first API call. User-instance systemd doesn't carry network-online.target, so After=network.target doesn't imply the resolver is up. The leading '-' makes the pre-step non-fatal so an offline boot still starts the unit.
* feat(hyprland): hide cursor after 2 seconds of inactivityCraig Jennings2026-05-131-0/+1
| | | | I set cursor:inactive_timeout to 2.0 so the cursor disappears after a couple of seconds without motion and reappears on the next move.
* fix(hyprland): keep cursor in place on keyboard focus changesCraig Jennings2026-05-131-1/+1
| | | | I set cursor:no_warps to true so super+j/k and other keyboard focus moves stop teleporting the cursor to the center of the newly focused window.
* chore: add signature PNG scans to common pictures dotfilesCraig Jennings2026-05-122-0/+0
|
* chore: add tasks for the 2026-05-11 VM-test validation warningsCraig Jennings2026-05-121-0/+25
| | | | I added a [#C] task with one child per validation warning from the 18:36 VM test, each with the check it comes from and a recommendation. Most are headless-VM or QEMU-slirp false positives the test harness should skip. The lingering and Docker ones have a small real angle: logind health in the VM, and "systemctl enable docker" vs "enable --now".
* chore: update VM-test-errors TODO with post-fix statusCraig Jennings2026-05-111-8/+9
|
* fix(archsetup): accept local-path repo specs in config validationCraig Jennings2026-05-111-11/+7
| | | | The `validate_config()` repo check I just added used a scheme allowlist (`http(s)://`, `git://`, `ssh://`, `user@host:path`), which rejected `ARCHSETUP_REPO=/tmp/archsetup-test` in `scripts/testing/archsetup-vm.conf`. That broke the VM test: archsetup exited during validation before logging anything, and `run-test.sh` reported "ArchSetup process not found after launch". `git clone` accepts local paths and `file://` URLs fine, so the allowlist was wrong. I replaced it with a security-only check: reject a leading dash (which `git` would parse as an option) plus whitespace and control characters, allow everything else. Smoke-tested against the test config and a matrix of repo forms.
* feat(archsetup): add input validation for config and usernameCraig Jennings2026-05-112-23/+85
| | | | | | | | A new `validate_config()` runs whenever `--config-file` is used and rejects bad values up front instead of letting the install run partway and die: `DESKTOP_ENV` must be dwm/hyprland/none (previously only caught in the display-server step), `AUTOLOGIN`/`NO_GPU_DRIVERS` must be yes/no (previously silently ignored), `LOCALE` gets a basic shape check, and the six `*_REPO` URLs get a scheme plus no-whitespace/no-leading-dash check before they reach `git clone`. I also pulled the username regex and reserved-names check out of `preflight_checks()` into a `validate_username()` helper, and call it from both `preflight_checks()` and `validate_config()`. That closes a gap: the old inline check only ran when the username was prompted, so a config-supplied `USERNAME=root` went through unchecked. This is not a security boundary: `load_config` sources the config as bash, so a hostile config can already do anything. It is about catching typos with a clear message. Verified with `bash -n` and a smoke-test matrix. The next `make test` run confirms valid configs still install.
* fix(archsetup): install fontconfig and dconf before calling themCraig Jennings2026-05-111-0/+6
| | | | | | The 2026-05-11 VM test surfaced three exit-127 / "dbus-launch returned 1" errors very early in the run: `fc-cache` and the two `dconf` writes in `user_customizations()`. The function runs as step 4 of 13 (before `aur_installer`, the DE step, and most of the package installs), so the binaries the function calls are not on PATH yet. I added `pacman_install fontconfig` and `pacman_install dconf` right before their use, mirroring the existing `pacman_install desktop-file-utils` pattern in the same function. Both are idempotent. Verified by `bash -n`. The next `make test` run confirms the behavior in the VM.
* chore: track findings from the 2026-05-11 VM test runCraig Jennings2026-05-111-2/+19
| | | | | | I added a TODO for the 7 errors logged during the run. A few look real: fc-cache and dconf hit exit 127, and gamemode failed for the user. A couple look like VM/nf_tables artifacts I want to confirm on bare metal. I moved the rlwrap-not-installed investigation to Resolved (DONE). rlwrap installs cleanly in a fresh VM, so the ratio glitch does not reproduce. The test-infra fix from the previous commit is also logged as DONE in Resolved.
* fix(testing): drop stale plugin checks, count failed validationsCraig Jennings2026-05-112-52/+9
| | | | | | validate_hyprland_plugins and validate_hyprpm_hook checked for the hyprland-plugins-setup script and the hyprpm pacman hook, both removed in 4a3056a (Hyprland 0.54 brings the layouts into core). I deleted the two functions and their calls in validate_window_manager. I also disabled errexit in run-test.sh from the validation phase onward, so one failed check is counted in VALIDATION_FAILED instead of aborting the run before the report or VM cleanup. About 16 validations across the file do a bare `return 1` after `validation_fail`; any of them firing under the previous behavior would have killed the harness mid-run.
* chore(dotfiles): refresh calibre runtime stateCraig Jennings2026-05-112-16/+4
|
* chore: reorganize task list and record open-source-release notesCraig Jennings2026-05-111-85/+132
| | | | Moved 13 completed tasks into the Resolved section. Recorded the open-source-release source audit and the dotfile-separation plan as dated subheaders under their tasks.
* docs: add GPL-3.0 LICENSE and initial READMECraig Jennings2026-05-112-0/+837
| | | | Initial README. Personal values (emails, URLs, repo names, the temporary root password) are placeholders for the eventual public release. LICENSE is the canonical GPL-3.0 license text.
* chore(tmux): double scrollback to 100000 linesCraig Jennings2026-05-101-1/+1
| | | | | | Long-running tmux+vterm sessions (Claude Code's TUI in particular) run past 50k lines often enough that the C-; x C tmux-history-copy command in Emacs can't reach the start. Bump history-limit so `tmux capture-pane' has more room; the cost is roughly 7.5 MB per pane, so a six-pane session adds well under 100 MB total. Existing panes keep their current buffer; the new limit applies only to panes created after the reload.
* feat: add post-install cmail Bridge setupCraig Jennings2026-05-093-0/+294
| | | | | | | | | | | | | | Bridge first-run is interactive, so I put the cmail wiring in a post-install helper rather than running it inside archsetup. scripts/cmail-setup-finish.sh handles the post-first-run steps idempotently: it decrypts the encrypted cmailpass, copies Bridge's self-signed cert to ~/.config/protonbridge.pem, symlinks the cmail-action triage helper into ~/.local/bin, and enables the user-level protonmail-bridge service. I added loginctl enable-linger in essential_services so the user service survives logout — without it, triaging cmail from a remote agent or SSH session has nothing to talk to. outro prints a four-step runbook for the manual steps after reboot.
* chore(dotfiles): drop ai-tooling refs from common/, plus minor driftCraig Jennings2026-05-076-68/+2
| | | | | | I removed the `ai-assistants` tmux launcher and the `.claude/settings.local.json` permissions stub from the stowed common dotfiles. The two `aliases.sh` files (bash and zsh) each lost a matching 5-line comment block about the Claude `ai` launcher. None of these belong in a shared dotfile tree. Two small adjacent updates landed in the same commit. The gitconfig `includeIf` path moved from `~/code/deepsat/` to `~/projects/work/deepsat/code/` to match the on-disk layout. Qalculate auto-saved its config version bump from 5.9.0 to 5.10.0.
* chore: mark quick-wins TODOs as DONECraig Jennings2026-05-071-3/+6
|
* refactor(archsetup): break dotfile-restore chain into guarded stepsCraig Jennings2026-05-071-3/+7
| | | | | | The previous block ran three operations under one error_warn: `cd "$dotfiles_dir" && git config --global --add safe.directory ... && git restore .`. If any one of them failed, the operator saw a single "restoring dotfile versions" warning with no clue which step broke. The cd was unnecessary because git's `-C` flag does the same thing without changing the calling shell's working directory. I split the block into two guarded steps. The `safe.directory` config runs first with its own error_warn. If that step succeeds, the `git restore` runs next with its own error_warn. If `safe.directory` fails, the dotfile restore is skipped entirely. The original cause gets logged once instead of cascading into a second error from git's dubious-ownership check. I also dropped the `cd` and used `git -C "$dotfiles_dir"` instead.
* fix(hyprland): source conf.d at end so machine-local overrides winCraig Jennings2026-05-071-1/+7
| | | | | | The `source = $HOME/.config/hypr/conf.d/*.conf` line was at the top of `hyprland.conf` (line 9), before the `general`, `input`, `monitor`, and other blocks. Hyprland reads top to bottom, so anything later in the main file silently overrode whatever `conf.d/local.conf` set. `local.conf` exists so one machine can override the shared defaults, for instance a HiDPI laptop bumping its monitor scale or shrinking gaps. None of that worked. I moved the source line to the end of the file behind a labeled section comment. Now per-machine overrides take effect. To verify, I dropped a `general { gaps_in = 99 }` into a temporary file in `conf.d/` and reloaded. `hyprctl getoption general:gaps_in` came back as 99 instead of the main file's 25. I removed the test file and the value went back to 25.
* fix(hyprland): natural-scroll the mouse, not just the touchpadCraig Jennings2026-05-071-0/+1
| | | | | | The `input` block had `natural_scroll = true` only inside its `touchpad` sub-block. The BT mouse fell back to Hyprland's default and scrolled the opposite way from the touchpad. Switching between input devices flipped scroll direction. I added `natural_scroll = true` at the top level of the `input` block. The touchpad's own setting still applies because Hyprland scopes touchpad config separately. Touchpad behavior is unchanged.
* fix(archsetup): tighten /efi mount permissions in fstabCraig Jennings2026-05-061-0/+11
| | | | | | archinstall writes the /efi line to /etc/fstab with `defaults` (or similar) and no fmask/dmask, so files inside end up 0755. Kernel images, initramfs, and bootloader config are world-readable on a freshly installed system. On a single-user machine that's mild, but there's no good reason to leave it that way. I added a guarded sed to boot_ux() that appends `fmask=0177,dmask=0077` to the /efi vfat line. Files end up 0600 and dirs 0700, root-only. The block is idempotent. Both guards check that the /efi line exists and that fmask= isn't already there before touching anything. I patched this machine's fstab the same way, so the new options take effect on next boot.
* fix(hyprland): override nogroup_border so scratchpads aren't magentaCraig Jennings2026-05-061-0/+5
| | | | | | Pyprland 3.4 started applying a `group deny` windowrule to every scratchpad. In Hyprland that flag routes the border through `col.nogroup_border` and `col.nogroup_border_active` instead of the regular `col.*_border` colors. Hyprland's defaults for those two are pink and bright magenta, so every scratchpad came up with a glaring magenta frame after the 3.4 upgrade. I set `col.nogroup_border_active` to dupre blue (#67809c) and `col.nogroup_border` to the same dark grey the inactive border already uses. Focused scratchpads read as a deliberate accent, unfocused ones blend in. The two new lines sit next to the existing `col.*_border` entries with a comment naming the cause, so the next person reading this config doesn't have to re-derive it.
* chore(dotfiles): move claude config to rulesets, add gitignore guardCraig Jennings2026-05-064-309/+5
| | | | | | I moved settings.json, .mcp.json, and commands/refactor.md to the rulesets repo so they travel across machines instead of being archsetup-specific. The local ~/.claude/ symlinks now point at rulesets. I also added the three paths to .gitignore so a stray re-add of any of them won't slip through. settings.local.json stays here because it's per-machine by convention.
* chore(claude): drop four unused plugins, switch editor to emacsCraig Jennings2026-05-061-5/+1
| | | | I dropped frontend-design, ralph-loop, security-guidance, and context7 from enabledPlugins. Context7 saw three tool calls across months of sessions. I never used the other three at all. I also switched editorMode back to emacs because the readline default fits my flow better than vim mode.
* chore(dotfiles): remove humanizer skill (moved to rulesets)Craig Jennings2026-05-061-474/+0
| | | | I moved humanizer to the rulesets repo where the rest of the skills live. The local ~/.claude/skills/humanizer symlink now points at the new location. That leaves no more skills under archsetup, so the empty .claude/skills directory is gone too.
* chore(dotfiles): switch default browser to firefox, add cask to PATHCraig Jennings2026-05-062-11/+12
| | | | I changed the default browser to Firefox. I also added ~/.cask/bin to PATH.
* chore(claude): align with ratio (gopls-lsp plugin + agent push notifs)Craig Jennings2026-05-041-2/+4
|
* chore(git): add includeIf rule for DeepSat reposCraig Jennings2026-05-041-0/+2
|
* chore(claude): persist prefersReducedMotion settingCraig Jennings2026-05-041-1/+2
|
* feat(mail): add work account to mbsync and msmtpCraig Jennings2026-04-273-0/+74
| | | | New dmail IMAP group with the standard 5-channel layout (inbox, sent, drafts, trash, starred), mirroring the gmail block. Matching SMTP account uses passwordeval against an encrypted password file at .config/.dmailpass.gpg.
* chore(todo): drop SCHEDULED from closed linux-lts checkCraig Jennings2026-04-271-1/+0
|
* feat(archsetup): install inotify-tools for cross-agent-commsCraig Jennings2026-04-272-0/+30
|
* feat(gitconfig): Add Git LFS filter configurationCraig Jennings2026-04-271-0/+5
|