aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* 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
|
* 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: add pycache directories to gitignoreCraig Jennings2026-04-241-0/+3
| | | | now ignoring all __pycache__ directories
* 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.
* fix(hyprland): Escape special workspace on navigateCraig Jennings2026-04-244-1/+304
| | | | | | | | | | | | | When focus is inside a special workspace (e.g. special:stash), layoutmsg cyclenext/cycleprev only operates within that workspace, trapping $mod+J inside the scratchpad overlay. Detect workspace name starting with "special:" on focus navigation (not move), toggle the overlay off first, re-read active window state, then fall through to the normal layout/floating branches. Add unit tests with a fake hyprctl harness in tests/layout-navigate/. ```
* 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.
* docs: complete .ai/ rename in CLAUDE.md layout + noteCraig Jennings2026-04-201-2/+2
| | | | | | | Missed in the main migration commit (sed pattern didn't match the layout table or the standalone 'docs/' reference in the note line). Layout now lists .ai/ correctly; gitignore note refers to .ai/ instead of docs/.
* restructure: move docs/ to .ai/ + sync latest templateCraig Jennings2026-04-202-2/+2
| | | | | Per claude-templates c36fd14. Claude tooling moves to hidden .ai/; project-level docs/ reserved for real documentation.
* fix: Zoom windowrule syntax (stayfocused → stay_focused on)Craig Jennings2026-04-191-2/+2
|
* chore: gitignore .claude/ and .cursorrulesCraig Jennings2026-04-131-0/+4
|
* feat: proton-vpn, lid switch, scratchpad resizingCraig Jennings2026-04-136-13/+35
| | | | | | | | | - 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)
* feat: Zoom HiDPI scaling and Hyprland window rulesCraig Jennings2026-04-112-0/+18
| | | | | Add Zoom.desktop override with QT_SCALE_FACTOR=1.5 for HiDPI displays. Float all Zoom windows and fix disappearing popup menus.
* fix: emacs-wayland package, Telegram autostart, velox config syncCraig Jennings2026-04-112-1/+2
| | | | | Switch emacs to emacs-wayland for native Wayland/PGTK support. Add Telegram tray autostart to hyprland.conf.
* fix: archsetup package fixes and velox post-install improvementsCraig Jennings2026-04-103-4/+83
| | | | | | 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.
* session: archsetup run on velox, multi-machine config supportCraig Jennings2026-04-101-0/+13
| | | | | | | | Ran archsetup on velox, fixed 7 package failures, enabled multilib, added dconf settings for fast portal-gtk startup. Introduced hyprland conf.d pattern for machine-local overrides. Cloned all repos, configured HiDPI scaling, gaps, and scratchpad sizing for laptop. Added resolution-adaptive config tasks to todo.
* docs: add usage examples to hyprland conf.d/local.confCraig Jennings2026-04-101-0/+13
|
* fix: archsetup package fixes, hyprland conf.d, dconf settingsCraig Jennings2026-04-103-5/+25
| | | | | | | | | Enable multilib repo for lib32/Steam packages. Move adwaita-qt5/qt6 to AUR, rename webkit2gtk to webkit2gtk-4.1, remove broken touchpad-indicator-git, replace tidal-dl-ng with tidaler fork, fix pocketbook URL. Add dconf GNOME interface settings to prevent 50s portal-gtk timeout. Add hyprland conf.d source pattern for machine-local overrides.
* 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-0914-23/+52
| | | | | | Add bind (dig, host, nslookup) to supplemental packages and systemd-resolvconf for wireguard DNS integration. Update calibre, hyprland, hyprlock, qalculate, mimeapps, and waypaper state.
* fix(hyprland): escape floating window focus trap in layout-navigateCraig Jennings2026-04-091-0/+11
| | | | | | layoutmsg cyclenext only operates on tiled windows, so $mod+J was a no-op when focus was on a floating/pinned scratchpad. Detect floating state and use cyclenext dispatcher instead.
* feat(hyprland): float xdg-desktop-portal-gtk dialogsCraig Jennings2026-03-081-0/+1
| | | | Prevents file open/save dialogs from disrupting master layout.