| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
| |
sort_windows now builds known project basenames from candidate dirs
and treats everything else as non-project. Prevents TUI apps (mc,
ranger, htop) from being misclassified as project windows.
|
| |
|
|
|
|
| |
Move select-window after sort_windows so the first new project gets
focus via stable window ID. Also restructure todo.org into flat task
list (V2MOM preserved in docs/v2mom.org).
|
| |
|
|
|
| |
Shell window was intermittently shifting to index 1 because sort_windows
hardcoded index 0, which conflicts with base-index=1 and renumber-windows.
|
| |
|
|
|
|
| |
Sort windows (shells at 0, projects alphabetically from 1) on every
session access including --attach. Move --attach check after function
definitions so sort_windows is available.
|
| |
|
|
|
|
| |
Extract attach_session, create_window, read_selections, and
build_candidates functions. Remove unused variable. Simplify
new-session window ID capture.
|
| |
|
|
|
|
| |
Windows are reordered after creation and when adding to an existing
session. Shell windows (bash/zsh) sort to the end. Window numbering
starts at 1. Focus lands on the first selected window.
|
| |
|
|
|
|
|
| |
Allow calling aix from within the ai tmux session to add new project
windows. Already-open projects are filtered from the selection list.
Use tmux window IDs instead of names to fix errors with dots in
directory names (e.g. chime.el).
|
| |
|
|
|
|
|
| |
Add zoom (AUR), cameractrls, v4l-utils to archsetup. Add Logitech BRIO
udev rule for auto-applying camera settings on connect. Adopt
logitech-brio-settings.sh into dotfiles. Remove flatpak (no longer used).
Update wallpaper config.
|
| |
|
|
|
|
| |
Add slack-desktop-wayland for Hyprland, slack-desktop for DWM.
Update Claude startup prompts, fix Hyprland portal/waybar startup
order, add signal-desktop Wayland .desktop override.
|
| |
|
|
|
|
|
| |
Provides flexible alternative to ai-assistants: multi-select project
directories via fzf, then open each in a tmux window running Claude.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
| |
encryptfile: encrypt file with AES256, prompt to delete original
decryptfile: decrypt to clipboard (wl-copy for Wayland, xclip for X11)
|
| |
|
|
| |
Configures default applications for file types via xdg-mime.
|
| |
|
|
|
| |
Script with type-specific icons and sounds for success, fail, alert,
question, alarm, info, security, and bug notifications.
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
| |
Move mimeapps.list to ~/.config/ location (takes precedence)
and set default applications:
- Browser: google-chrome
- Documents: zathura (pdf, epub, mobi, cbz, cbr)
- Images: feh
- Video/Audio: mpv
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Keyring:
- Add empty-password login.keyring template to dotfiles
- Remove init-keyring script (secretstorage API requires prompting)
- Remove python-secretstorage dependency
- Remove PAM gnome-keyring config (not needed with template approach)
Hyprpm:
- Only run hyprpm reload if plugins are installed
- Prevents "Failed to load plugins" warning on fresh installs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Move files that are specific to DWM/X11 setups:
- gpg-agent.conf (uses pinentry-dmenu)
- pinentry-dmenu.conf
- Desktop files using X11 tools (st, slock, sxiv, etc.)
These conflict with hyprland equivalents and should only
be stowed on DWM systems.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
| |
|
|
|
|
|
| |
Minimal script to register org-protocol:// scheme handler.
Extracted from resetmimetypes script.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
| |
|
|
| |
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Removed scripts:
- dotfiles_pushall, lsbak, project, protonvpn, steam
- sudo-update-grub, sysupdate, transadd, update-backup-repositories
- virtstart, ytp (duplicate of alias)
Updated yt-dlp aliases in media.sh:
- --add-metadata -> --embed-metadata (deprecated option)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
| |
|
|
|
|
|
| |
- Remove lfrun and lfub (lf file manager not installed, using ranger)
- Update ytp script: --add-metadata -> --embed-metadata
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
|
Rename dotfiles/system to dotfiles/common for clarity - indicates
shared dotfiles used across all desktop environments (DWM, Hyprland).
Removed config directories for uninstalled applications:
- ghostty (using different terminal)
- lf (using ranger instead)
- mopidy (using mpd instead)
- nitrogen (X11-only, obsolete for Wayland)
- pychess (not installed)
- JetBrains (not installed via archsetup)
- youtube-dl (using yt-dlp with different config location)
Kept audacious config for potential future use.
Updated all references in archsetup, CLAUDE.md, todo.org, and
validation.sh.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|