aboutsummaryrefslogtreecommitdiff
path: root/dotfiles/common
Commit message (Collapse)AuthorAgeFilesLines
* refactor: drop in-repo dotfiles/, move stow tooling to the dotfiles repoCraig Jennings12 days644-830599/+0
| | | | | | | | Since the installer clones DOTFILES_REPO into ~/.dotfiles and stows from there, the in-repo dotfiles/ tree was dead weight. Nothing reads it at install time. I removed it (831 files) now that both machines are migrated. The Makefile's stow / restow / reset / unstow / import targets and the dotfile-script unit suites moved to the dotfiles repo. They sit alongside the scripts they manage and run standalone (cd ~/.dotfiles && make ...). This Makefile keeps the VM-integration targets and the installer-helper suite (safe-rm-rf). I updated CLAUDE.md and README.md so stow operations run from ~/.dotfiles, and the dotfile-management, theme, and unit-test sections point at the standalone repo. The README was already describing the old in-repo model from before the installer switched to cloning. This brings it in line.
* feat(notify): add --silent flag, volume knob, and level sound filesCraig Jennings2026-05-219-8/+35
| | | | | | | | The touchpad toggle's notification was too loud, and the eight notify sounds varied by ~13 dB in RMS loudness — bug and fail came out two to three times louder than info or security. I added a --silent flag to notify (shows the popup, plays no sound) and a NOTIFY_VOLUME knob (paplay scale, default 65536) so the master level can drop without re-encoding. toggle-touchpad now passes --silent on both enable and disable. normalize-notify-sounds.sh measures each .ogg and shifts it to a uniform -31 dB mean. It writes through the file instead of mv-ing over it, so the stow symlinks survive when the script runs against the live sound dir. I re-encoded all eight sounds to the new level. Tests: a new tests/notify suite (12 tests) covers --silent, the volume knob, flag composition, and the error paths.
* feat(authinfo): add calendar feed URLs for calendar-syncCraig Jennings2026-05-211-0/+0
| | | | The .ics feed URLs are secret tokens, so I keep them in the encrypted store instead of a plaintext config. Emacs calendar-sync looks them up at sync time through auth-source on the calendar-google, calendar-proton, and calendar-deepsat hosts. They travel across machines now with the rest of authinfo.
* chore(btop): sync config to v1.4.7 defaultsCraig Jennings2026-05-201-2/+16
|
* feat(tmux-util): add rename subcommand (fzf pick + prompt)Craig Jennings2026-05-191-2/+48
| | | | | | | | | | | | | | tmux-util rename closes out the original six-subcommand plan. The flow: 1. fzf-pick a session from the list. 2. Prompt for a new name on stdin. 3. Bail with a useful message on empty input, same-as-old, or conflict with an existing session. 4. Otherwise `tmux rename-session -t <old> <new>` and confirm. The conflict check uses `tmux has-session -t =<new>` with the same `=`-prefix exact-match guard as the go subcommand. Without it, tmux's default prefix matching would let `rename foo` succeed even when a session named `foobar` already exists, then surprise the user later. 5 new tests cover Normal cases (pick + rename happy path) and Boundary cases (no sessions, fzf cancel, empty new name, same-as-old no-op, conflict with existing session). The test harness's run_script grew an `stdin=` param so tests can feed the prompt input. fake-tmux picked up a rename-session handler that mutates the state file. Total suite: 48 tests, all green. Six subcommands shipped: go, pick, ls, find, reap, rename. The original "no args prints help" requirement still holds, and the stub-test for unimplemented subcommands got removed since everything's wired now.
* feat(tmux-util): add pick subcommand (fzf session switcher)Craig Jennings2026-05-191-1/+38
| | | | | | | | | | | | | tmux-util pick lists every session ("attached"/"detached" plus name), pipes it through fzf, and attaches or switch-clients to the chosen one (matching the go subcommand's inside-vs-outside-tmux discipline). If the user cancels fzf (Ctrl-C, Esc, empty selection), the pipeline returns empty and pick exits 0 without touching tmux state. The new fake-fzf testing fake is driven by env vars: - FAKE_FZF_CHOICE_LINE=<N>: return the Nth line of stdin as the selection - FAKE_FZF_CHOICE=<string>: return the literal string (ignores stdin) - (neither): exit 130 to simulate cancel 4 new tests cover Normal cases (pick second line, inside/outside tmux behavior) and Boundary cases (no sessions, user cancellation). Total suite: 43 tests, all green.
* feat(tmux-util): add find subcommandCraig Jennings2026-05-191-1/+27
| | | | | | | | | | | | | tmux-util find <pattern> walks every pane across every session, queries each pane's foreground command (`#{pane_current_command}`), and prints the location of any pane whose command matches the pattern. Output format: `<session>:<window>.<pane> <command>`, one per line. Pattern is a basic ERE (passed through `grep -E`), so anchors and alternation work. Substring matching is the common case. Exit code: - 0 with output: matches found - 1 with no output: no matches (lets you script around it) - 2 with usage on stderr: missing or empty pattern 7 new tests cover Normal cases (single match, multi-match across sessions, format verification) and Boundary cases (no matches, no sessions, missing pattern, empty pattern). fake-tmux now parses pid:cmd entries in the state file so panes can carry a synthetic command name. Total suite: 39 tests, all green.
* feat(tmux-util): add go subcommand (attach-or-create)Craig Jennings2026-05-191-1/+35
| | | | | | | | | | | tmux-util go <name> attaches to a session named <name> if it exists, creates it otherwise. Behavior depends on whether the caller is already inside tmux: - Outside tmux: `tmux attach-session -t <name>` (existing) or `tmux new-session -s <name> -c $PWD` (new). - Inside tmux (TMUX env set): `tmux switch-client -t <name>` (existing) or `tmux new-session -d -s <name> -c $PWD` followed by `switch-client` (new). Attaching from inside tmux would nest sessions and break the outer view, so the inside path uses switch-client instead. The existence check uses `tmux has-session -t =<name>` with the leading `=` to force exact-match. Without it, tmux does prefix matching, which would let `go foo` resolve to a session named `foobar`. I added 6 new tests covering both inside/outside-tmux paths, both create/attach paths, plus error handling for missing or empty name arguments. fake-tmux picked up handlers for new-session (mutates state), attach-session and switch-client (record-only), and the `=`-prefix form of has-session. Total suite: 32 tests, all green.
* feat(tmux-util): add ls subcommandCraig Jennings2026-05-191-1/+53
| | | | | | | | | | | | tmux-util ls is an opinionated replacement for `tmux ls` with columns for state (attached/detached), name, idle time (humanized), window count, and the current pane's cwd (tilde-fied if it sits under $HOME). The cwd query goes through `tmux display -p -t <session> '#{pane_current_path}'`, which returns the cwd of the active pane of the active window. That's close enough to "what the session is about" for a one-line summary. Idle calculation reads `date +%s` by default and accepts an override via the TMUX_UTIL_NOW env var so tests can pin "now" to a known epoch. 12 new tests cover Normal cases (attached / detached, multiple sessions) and Boundary cases (no sessions, idle exactly at minute / hour / day boundaries, $HOME tilde). One existing dispatch test got reworked because the original stub target (`ls`) is no longer unimplemented. Total suite is 26 tests, all green. The fake-tmux harness picked up two things along the way: real format-string parsing for `list-sessions -F` and a new handler for `display -p`. The state file format extended to include activity epoch, window count, and cwd, with sensible defaults for older 3-tuple test inputs so the reap tests keep passing untouched.
* feat(tmux-util): add script skeleton and reap subcommandCraig Jennings2026-05-191-0/+107
| | | | | | | | | | | | A new utility in dotfiles/common/.local/bin/ for managing tmux sessions. The eventual plan covers six subcommands (go, pick, ls, find, reap, rename). This commit ships the skeleton, the dispatch + help, and the first subcommand: reap. reap walks every unattached tmux session whose name doesn't match $TMUX_UTIL_REAP_SKIP (default `^aiv-`), sends SIGHUP to each pane's PID (the same signal that fires when you close a terminal window), waits up to three seconds for the session to wind down, and falls back to `tmux kill-session` if anything's still alive. Tests live under tests/tmux-util/ with the same fake-binary-on-PATH pattern layout-navigate uses. fake-tmux reads canned session state from a file and records every invocation. fake-kill records signal calls without sending them. fake-sleep is a no-op so tests don't actually wait. 14 tests cover Normal / Boundary cases for dispatch + reap. Run them with: cd tests && python3 -m unittest tmux-util.test_tmux_util The other five subcommands stub out for now and exit non-zero with "not implemented yet" so future TDD turns can drop them in one at a time.
* 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.
* 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.
* chore: add signature PNG scans to common pictures dotfilesCraig Jennings2026-05-122-0/+0
|
* chore(dotfiles): refresh calibre runtime stateCraig Jennings2026-05-112-16/+4
|
* 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.
* 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(dotfiles): move claude config to rulesets, add gitignore guardCraig Jennings2026-05-063-309/+0
| | | | | | 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.
* feat(gitconfig): Add Git LFS filter configurationCraig Jennings2026-04-271-0/+5
|
* fix(log-cleanup): handle filenames without YYYY-MM-DD via epoch fallbackCraig Jennings2026-04-271-2/+9
| | | | If no YYYY-MM-DD matches, the script now looks for a 10-digit epoch between underscores in the filename and converts it via date -d. The existing 24-hour mtime guard still protects the active session log from being deleted while it's still being written to.
* chore(claude): Clean up settings and add vim modeCraig Jennings2026-04-241-24/+16
| | | | | | Remove git-commit and gh-pr-create confirmation hooks, remove code-review plugin, reorder keys alphabetically, and enable vim editor mode.
* claude/settings: sync archsetup source to live — hooks + plugins + attributionCraig Jennings2026-04-201-0/+31
| | | | | | | | | | | | | | | Merges live ~/.claude/settings.json content (hooks: PreCompact + PreToolUse/Bash with git-commit-confirm, gh-pr-create-confirm, destructive-bash-confirm; enabledPlugins) into the archsetup source that velox was already symlinking. Previous state: velox symlinked archsetup source (attribution only, missing hooks/plugins). Ratio had a standalone file (hooks/plugins but no attribution). Both machines asymmetric and incomplete. Now: single source of truth in archsetup/dotfiles/common/.claude/ settings.json. Ratio needs to replace standalone file with symlink (manual step per-machine).
* claude/settings: suppress commit and PR attribution structurallyCraig Jennings2026-04-201-1/+5
| | | | | | | | | | | | | | | Adds the empty-string attribution block that disables Claude Code's auto-added attribution lines (Co-Authored-By, 'Generated with Claude Code', etc.) at the tool layer, matching the existing 'no Claude attribution' rule in protocols.org. Two complementary enforcement layers now: - prompt-level rule (protocols.org) - tool-level setting (this commit) Same intent already lives in rulesets/languages/elisp/claude/settings.json for elisp project bundles; this brings it to the global Claude Code config that ships via archsetup.
* remove aix and hey: 'ai' lives in claude-templates nowCraig Jennings2026-04-203-393/+6
| | | | | | | | | | | | | | Both the aix script and hey shell function are superseded by the unified 'ai' launcher in claude-templates (bin/ai, installed via make install). Single command, three modes, smart in-tmux behavior so all sessions survive Hyprland crashes. Per-machine setup adds a step: cd ~/projects/claude-templates && make install The orphaned ~/.local/bin/aix symlink should be removed manually on each machine after pulling this change (rm ~/.local/bin/aix). Stow re-stow would also clean it up.
* hey: convert alias to function with git awareness + FETCH_HEAD cacheCraig Jennings2026-04-202-2/+98
| | | | | | | | | | | | | | | | | | | The 'hey' alias launched claude with 'Read docs/protocols.org' — broken after the docs/ → .ai/ restructure. While updating the path, add matching behavior to aix: - Bail early if the current dir isn't a .ai/ template project - Fetch upstream only when FETCH_HEAD is stale (>10 min old) — avoids re-fetching on back-to-back invocations in the same project - Auto-pull when clean, behind, not ahead - Print a one-line git-status summary otherwise (↑N ↓N dirty) - Launch claude with the updated .ai/protocols.org path Function identical across .bashrc.d and .zshrc.d (bash/zsh compatible). Tested: non-template dir bails cleanly with exit 1; template project shows status and launches claude; repeated invocations reuse FETCH_HEAD cache silently.
* aix: synchronous fetch + git-status annotations + auto-pull if cleanCraig Jennings2026-04-201-3/+98
| | | | | | | | | | | | | | | | | | | | | | | | | Adds multi-machine sync awareness to the session launcher. Before fzf: - Fetches all candidate repos in parallel (capped at 6 concurrent) - Annotates each entry with git status: (↑N ↓N dirty), (no upstream) - Clean repos show no annotation When launching a window: - If working tree is clean, has upstream, is behind (not ahead): pull - Otherwise: open window as-is, user handles any sync manually Design choices: - Fetches are synchronous — accurate status at the cost of a brief wait on session start. Parallel execution keeps it fast (~1-2s for 22 repos). - Pull is --ff-only — never merges, never creates merge commits in aix - Diverged repos (ahead AND behind) trigger no auto-action; user decides - No stash/pop dance — unreliable in multi-project batches; prefer explicit awareness via annotation Primary use case: moving between laptop and desktop. Wrap-it-up's always-push ensures remote is current at session end; this ensures local is current at next session start.
* aix: update to .ai/ layout; filter candidates to template projectsCraig Jennings2026-04-201-4/+11
| | | | | | | | | | | | | | Two changes: - AI_INSTRUCTIONS now points at .ai/protocols.org (was docs/) — aligns with the template docs/ → .ai/ restructure - build_candidates filters directories to those with .ai/protocols.org present. Previously listed every dir under ~/code/ and ~/projects/ including third-party clones and non-template projects, which would fail silently when Claude tried to read a missing protocols file. New projects that haven't been initialized (no .ai/ yet) will not appear in the fzf list. Bootstrap those with a direct claude invocation; the first-session workflow takes over once .ai/ exists.
* feat: proton-vpn, lid switch, scratchpad resizingCraig Jennings2026-04-131-0/+6
| | | | | | | | | - archsetup: add proton-vpn-gtk-app; configure logind to ignore lid switch - hyprland.conf: autostart protonvpn-app minimized - waybar: set battery module to BAT1 (velox) - pypr: resize scratchpads to fit 80x24 minimum; enlarge monitor for btop - gitconfig: add deepsat GHE credential helpers - CLAUDE.md: update notes.org reference (lowercase)
* fix: archsetup package fixes and velox post-install improvementsCraig Jennings2026-04-101-3/+2
| | | | | | Fixed multilib, adwaita-qt, webkit2gtk, touchpad-indicator, tidaler, pocketbook URL. Added post-archsetup review tasks for laptop setup. Updated mbsyncrc for STARTTLS and waypaper config.
* chore: add Claude Code local permissions to dotfilesCraig Jennings2026-04-091-0/+11
|
* feat: add Claude Code settings to stowed dotfilesCraig Jennings2026-04-094-0/+757
| | | | | Add commands, settings, MCP config, and humanizer skill to dotfiles/common for GNU Stow management across machines.
* feat: add bind package for DNS utilities, update dotfile stateCraig Jennings2026-04-099-20/+39
| | | | | | Add bind (dig, host, nslookup) to supplemental packages and systemd-resolvconf for wireguard DNS integration. Update calibre, hyprland, hyprlock, qalculate, mimeapps, and waypaper state.
* chore: clean up lock screen comment, update calibre stateCraig Jennings2026-03-071-5/+5
| | | | Removed stale sxhkdrc reference from lock screen keybinding comment.
* feat: comprehensive mime type associations with emacsclient defaultsCraig Jennings2026-03-073-214/+190
| | | | | | | Merge all mime associations into mimeapps.list as single source of truth. Set emacsclient as default for all text/code files. Add TypeScript mime override, emacsclient.desktop with fixed Exec line, and simplify resetmimetypes to just restow + rebuild caches.
* chore: update calibre, mimeapps, authinfo, add outbox itemsCraig Jennings2026-03-075-12/+10
| | | | | Calibre window geometry and scheduler updates. Add Signal URI handlers. Move processed inbox items to outbox.
* chore(hyprland): update hypridle settings, update calibre configsCraig Jennings2026-03-062-71/+7
| | | | | Dim at 5min, lock at 7min, remove DPMS off and suspend. Update calibre sort history and window geometry.
* feat(hyprland): rebind mod+shift+f to allfloat, add chess setup scriptCraig Jennings2026-03-023-14/+31
| | | | | | | Add workspace allfloat toggle on mod+shift+f (was togglefloating, now on mod+shift+space only). Add scripts/setup-chess.sh for En Croissant, lc0, Maia, and Stockfish setup. Update log-cleanup to use filename dates instead of mtime. Update ssh and calibre configs.
* feat(archsetup): add rustup, log-cleanup cron, update configsCraig Jennings2026-02-272-0/+15
| | | | | | | Add rustup toolchain manager to developer_workstation (before AUR packages that need rust to compile). Add log-cleanup cron job with test validation. Update ISO glob for archangel naming. Add dunst icon theme, hyprlock animations, waybar log filtering.
* chore: add ssh config, update todo, add Berkeley Mono NF web fontsCraig Jennings2026-02-259-0/+6
| | | | | | | | Add deepsat GitHub Enterprise host to ssh config, reorganize todo.org with GitHub release prep tasks, add Berkeley Mono Nerd Font woff/woff2 variants, and move podman notes to outbox. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(archsetup): add texlive-plaingeneric and masterpdfeditor packagesCraig Jennings2026-02-214-7/+131
| | | | | Add texlive-plaingeneric for org-mode PDF export (ulem.sty) and masterpdfeditor from AUR for PDF form editing. Update calibre config.
* chore(calibre): update config, add Comments Cleaner and Reading List pluginsCraig Jennings2026-02-169-54/+212
|
* feat(hyprland): resize term scratchpads, rename term2 to ai-termCraig Jennings2026-02-142-9/+5
| | | | | Term scratchpads now 50x70%, renamed term2 to ai-term with updated app-id. Updated calibre window state.
* feat(ncmpcpp): bind x to toggle_consume, update calibre stateCraig Jennings2026-02-142-3/+3
| | | | | Replaced default crossfade binding with consume toggle. Calibre usage stats updated from normal use.