Clean up dotfiles: fix themes, remove duplicates, add missing configs - #13
Merged
Conversation
…ing configs - Fix Kitty theme: custom warm purple matching Sway/Waybar/Rofi/Mako palette - Fix Kitty include path (was broken after install.sh copy) - Replace FiraCode Nerd Font with Iosevka Nerd Font (Linux only) - Add OS-specific theme override in install.sh (Linux=purple, macOS=Mocha) - Remove duplicate directories: bash/, config/, git/, shell/ (all shadowed by common/) - Remove .bak files from version control - Add machine.md stubs for debian, fedora, alpine - Guard unprotected source of ~/.local/bin/env in .zshrc and .bashrc - Add install.sh deployment for .tmux.conf, .inputrc, .gdbinit - Move sudo.sh to common/shell-functions/, track sudo-askpass.sh - Add fedora/alpine routing in refresh-machine-state.sh - Include accumulated config updates (vim, shell-functions, git, tmux) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Runs on push/PR: spins up Arch (container), Debian (container), and macOS (native runner) to verify install.sh deploys correctly on each. Checks symlinks, copies, kitty theme per OS, and font config. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FiraCode Nerd Font is the preferred font on both platforms. Installed via ttf-firacode-nerd on Arch. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a fast lint job (shell syntax, shellcheck, git config parse, CoC JSON validation) that gates the platform tests. Platform tests now validate configs actually load: - Kitty: headless parse via kitty +runpy with load_config(), checks for bad lines, verifies parsed font/opacity/cursor values - Vim: loads vimrc in ex mode (vim -e, not -es which breaks line continuations), runs PlugInstall --sync - tmux: starts headless server, verifies config loads - Git: parses .gitconfig, counts aliases - Shell: bash -n / zsh -n syntax validation on deployed configs - Fonts: fc-list -q to verify font actually resolves (not fc-match which always falls back) - Theme: verifies correct colors deployed per OS (purple on Linux, Catppuccin Mocha on macOS) Each platform uploads an evidence artifact with install log, deployed file listing, theme contents, git aliases, and vim plugin list. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Matches the deployed config on the Arch box. Super+ gives macOS-style shortcuts on Linux (Sway passes Super to apps), ctrl+shift+ as fallback. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
woud420
added a commit
that referenced
this pull request
Jul 10, 2026
* claude generated ai context files to have better ai-context * Add install support for AI context files and pacman hook - Add install_ai_context() to symlink CLAUDE.md, AGENTS.md, MACHINE.md - Add install_pacman_hook() with __DOTFILES_DIR__ templating - Run refresh-machine-state.sh during install to bootstrap state file - Symlink generated machine-state.md to ~/MACHINE-STATE.md Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add jm-home-box convergence tooling * Sync dotfiles from personal laptop * Reconcile laptop dotfiles with cleanup history * Track Arch Sway config * Tune desktop keybindings * Add Arch-only personal-pink kitty background Override the kitty theme background with a dark plum (#2A1E2E) that coordinates with the Sway purple/pink accent (#9d5a7f), matching the jm-home-box machine.toml style = "personal-pink". Scoped to Arch only: install.sh overlays linux/arch/.config/kitty/*.conf over the shared common/themes after copying them, guarded by DISTRO=arch. macOS and other distros keep stock Catppuccin-Mocha (#1E1E2E). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Restore rofi-based sudo askpass helper The cross-platform askpass script (rofi on Linux, osascript on macOS) had gone missing on this branch, breaking sudo -A. Restore it from abfeea3 and track it so it stops disappearing. rofi inherits the system theme.rasi, matching Sway/Waybar/Mako without any custom styling. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Add default git commit template * Add Neovim-backed editor setup Install Neovim alongside the existing Vim config and alias vi/vim/vimdiff to nvim when available. Keep installs copy-based with path-preserving backups and audit logs, and add installer/editor parity checks. Remove the GNU which alias and replace it with a shell-aware lookup wrapper so aliases are visible. Tests: make check; make check-editor * Normalize GitHub URL rewrite config Keep the GitHub HTTPS-to-SSH rewrite with the rest of the top-level Git settings after the laptop branch merge. Checks: git diff --check -- common/git/.gitconfig; git config --file common/git/.gitconfig --get-regexp * Add default git commit template * not using cursor so removing * removing examples * removed old unused prompts * Sync laptop brew and shell config Update the macOS Brewfile from the current no-description Homebrew bundle dump. Add guarded git-ai PATH support for bash/zsh and suppress zsh no-EOL markers. Skipped the local git-ai Git trace2 socket because it is machine-local daemon state, not portable dotfiles config. Checks: make check; make check-editor; zsh -n common/shell/.zshrc; bash -n common/shell/.bashrc; git diff --check. Brew bundle check still reports docker-desktop needs install/update. * Refresh jm-home-box state after 2026-06-13 system update - machine-state.md: bump kernel, bash, python, node, docker, kubectl, terraform; drop go/rust from PATH (not installed); replace stale recently-installed list with full AUR explicit-package inventory - machine.toml: expand aur[] to reflect all explicitly installed AUR packages (GPU drivers, nordic theme, swayfx, fonts, apps) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Install nvim, remove python38; update machine-state accordingly - Installed neovim 0.12.3 (was in machine.toml but missing from system) - Removed python38 3.8.20 (legacy, 111 MiB freed) - machine-state.md: reflect nvim version, drop python38, bump pkg count to 896 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Remove big data stack (cassandra, apache-spark, apache-gremlin-console) 712 MiB freed. Update machine-state.md to reflect removal and drop pkg count to 892. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix installer: copy-only default, path-preserving backups, nvim wiring - Default COPY_MODE=true; --symlink flag for explicit opt-in (non-negotiable constraint from combined plan: no symlinks) - backup_file() now preserves directory structure under BACKUP_DIR and shows destination path in both real and dry-run output - install_vim_config() expands dry-run output to list every file individually - Add nvim install step: copies common/nvim/init.vim -> ~/.config/nvim/init.vim (bridges to existing vim config; identical behavior on both machines) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix Sway keybindings and NVIDIA Wayland setup * Track desktop GTK and Waybar theming * Clean up dotfiles: fix themes, remove duplicates, add missing configs (#13) * Clean up dotfiles: fix Linux theme/fonts, remove duplicates, add missing configs - Fix Kitty theme: custom warm purple matching Sway/Waybar/Rofi/Mako palette - Fix Kitty include path (was broken after install.sh copy) - Replace FiraCode Nerd Font with Iosevka Nerd Font (Linux only) - Add OS-specific theme override in install.sh (Linux=purple, macOS=Mocha) - Remove duplicate directories: bash/, config/, git/, shell/ (all shadowed by common/) - Remove .bak files from version control - Add machine.md stubs for debian, fedora, alpine - Guard unprotected source of ~/.local/bin/env in .zshrc and .bashrc - Add install.sh deployment for .tmux.conf, .inputrc, .gdbinit - Move sudo.sh to common/shell-functions/, track sudo-askpass.sh - Add fedora/alpine routing in refresh-machine-state.sh - Include accumulated config updates (vim, shell-functions, git, tmux) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add CI workflow to test install.sh across Arch, Debian, and macOS Runs on push/PR: spins up Arch (container), Debian (container), and macOS (native runner) to verify install.sh deploys correctly on each. Checks symlinks, copies, kitty theme per OS, and font config. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Use FiraCode Nerd Font on Linux (same as macOS) FiraCode Nerd Font is the preferred font on both platforms. Installed via ttf-firacode-nerd on Arch. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Rewrite CI with deep config validation, not just file existence checks Adds a fast lint job (shell syntax, shellcheck, git config parse, CoC JSON validation) that gates the platform tests. Platform tests now validate configs actually load: - Kitty: headless parse via kitty +runpy with load_config(), checks for bad lines, verifies parsed font/opacity/cursor values - Vim: loads vimrc in ex mode (vim -e, not -es which breaks line continuations), runs PlugInstall --sync - tmux: starts headless server, verifies config loads - Git: parses .gitconfig, counts aliases - Shell: bash -n / zsh -n syntax validation on deployed configs - Fonts: fc-list -q to verify font actually resolves (not fc-match which always falls back) - Theme: verifies correct colors deployed per OS (purple on Linux, Catppuccin Mocha on macOS) Each platform uploads an evidence artifact with install log, deployed file listing, theme contents, git aliases, and vim plugin list. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add super+ keybindings to Linux kitty config with ctrl+shift fallbacks Matches the deployed config on the Arch box. Super+ gives macOS-style shortcuts on Linux (Sway passes Super to apps), ctrl+shift+ as fallback. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Consolidate on install.sh as the single install tool scripts/dotfiles.py and install.sh overlapped on the copy step but split responsibilities: only install.sh could bootstrap a machine (packages, vim plugins, CoC, fzf), while only dotfiles.py knew about the Arch desktop files. One tool is enough: - install.sh gains install_desktop_configs: on Arch, everything under linux/arch/.config/ is copied into ~/.config/ preserving relative paths (sway, waybar, gtk-3.0/4.0, and any future tool configs), with the kitty subdir still applied as theme overlays. - Remove scripts/dotfiles.py, common/bin/dotfiles, and machines/jm-home-box/machine.toml (nothing consumes machine.toml anymore; OS/distro detection covers the real per-machine differences). - Remove the dotfiles-* Makefile targets and rewrite the README convergence section around the single entry point. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Cherry-pick stranded fixes: CoC fallback, git hooks, rofi/mako, askpass From bugfix/coc-nvim-ci-error: extract a shared compile_coc_nvim helper (npm ci with lockfile, npm install fallback, non-fatal on failure) used by both the vim and nvim paths, replacing two duplicated bare `npm ci` blocks; lightweight typescript-vim + vim-jsx-typescript plugins with polyglot's heavy TS syntax disabled; git-lfs filter in .gitconfig. From the rescued home-box commit 3dabbca: personal global git hooks (pre-commit blocks secrets/conflict markers/oversized files, pre-push runs a configured repo check; both delegate to repo hooks like .husky first), installed copy-based to ~/.config/git/hooks with core.hooksPath set by the installed .gitconfig, plus a make install-git-hooks target. From feature/add-linux-box: the mako notification config, rofi theme.rasi (used by the rofi sudo-askpass prompt), and the Arch README - picked up automatically by install_desktop_configs. sudo askpass: the installer now copies scripts/sudo-askpass.sh to ~/.local/bin/sudo-askpass, and sudo.sh points SUDO_ASKPASS there instead of hardcoding ~/workspace/dotfiles (which was wrong on any machine with a different checkout path). fix/charlie-lab-laptop reviewed for leverage: its only unique content is work-laptop machine captures and Brewfile entries already present or out of scope; nothing further taken. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Close the gaps: local overrides, SSH config, honest docs, Makefile cleanup - Machine-local override hooks now actually exist: ~/.bashrc.local and ~/.zshrc.local are sourced at the end of the shell configs (the README promised this but nothing implemented it), and .gitconfig gains an [include] of ~/.gitconfig.local that wins over shared values - the sanctioned home for tool-appended blocks (git-ai PATH/trace2) that copy-based reinstalls would otherwise clobber. - common/ssh/config is finally installed: copied to ~/.ssh/config.dotfiles and Include'd from ~/.ssh/config so machine-local host entries keep precedence, with IgnoreUnknown UseKeychain so the macOS-only option is harmless on Linux. - Makefile: the broken legacy section is gone (duplicate darwin target, misspelled brews rule with an Intel-only path, backup-bash calling a script that does not exist, no-op profile-source, misleading stow-* aliases, unlink of files nothing installs) and help now matches the targets that exist. - README: real clone URL, master instead of main in the raw one-liner, shell-function table split into what works vs the disabled stubs that are deliberately kept for incremental restore, kubectl section trimmed to the k alias and kctx, accurate git-hooks and AI-context sections. - install.sh closing tips no longer advertise sshdot / k get p, which do not exist. - scripts/update_cursor_tools.py removed (cursor was dropped earlier). - The two-agent convergence plan artifacts from jm-home-box are archived under docs/convergence/ (combined-plan.md and inputs) with docs/reference/color-linux-box.md kept as a container-theming example, and docs/machine-convergence-plan.md marked historical with the decisions that supersede it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix all 34 findings from adversarial review Installer correctness: - First-run no longer aborts: vim/nvim PlugInstall get </dev/null and a log_warning guard (a fresh machine hit E185 from the not-yet-installed colorscheme, hung at press-ENTER or died under set -e, silently skipping the nvim bridge, fzf, and AI-context steps); appearance.vim now uses silent! colorscheme. - compile_coc_nvim's subshell is now the if-condition, so an npm failure reaches the intended warning instead of tripping set -e (the previous guard was dead code). - --dry-run no longer creates ~/.config/{git,kitty,htop} and logs the real backup destination; install_vim_config dedupes its dry-run branch (settings.vim was missing from the log) and drops a duplicated nvim init.vim install; minimal mode skips plugin installation; fzf install no longer aborts when ~/.fzf exists or the network fails; stale --symlink usage comment removed. - SSH: the Include is prepended to ~/.ssh/config instead of appended - an Include after a Host block only applies to that host, and IgnoreUnknown must parse before any UseKeychain reaches Linux openssh. Shell configs: - .bash_profile guards ~/.local/bin/env like the other rc files. - bash prompts wrap color escapes in \[ \] (raw escapes corrupt readline line wrapping); single path_prepend definition moved before shell-function loading with one comprehensive call (the merge had left a raw duplicate block that re-prepended on every source). - .zshrc path_prepend includes ~/.local/bin; macos-clipboard.sh gets a shebang (shellcheck error severity would fail CI). - pre-commit hook: mapfile -d replaced with a bash-3.2-portable read loop (macOS system bash) and ======= alone no longer false-positives as a conflict marker. CI workflow: - Fixed invalid YAML in the install.sh syntax step (plain scalar with a colon - GitHub would have rejected the whole file). - set -o pipefail on the three install steps (| tee masked failures), personal-pink assertion now enforcing, debian/macos jobs assert the AI-context files, lint job runs apt-get update before installing zsh. Repo hygiene and docs: - Untracked generated linux/arch/ai-context/machine-state.md (gitignore already declared it); deleted orphaned root .dircolors, .dircolors-catpuccin, .gnu_aliases, .profile, stale linux/common/current-theme.conf, cursor .gitignore entry, and the unused hashicorp tap. - README: working remote-install commands, dropped nonexistent v/kns, package list matches the Brewfile; linux/arch/README.md now describes the copy-based install.sh flow, the real kitty overlay (#2A1E2E), and drops stale AMD GPU claims (the box runs NVIDIA); quick-install.sh uses copies instead of symlinks per policy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * CI: use bash shell in container jobs, writable evidence dir Debian's default step shell is dash, which rejects set -o pipefail (GitHub's explicit bash shell runs with -eo pipefail built in), and /tmp/evidence was created by root while testuser writes the report. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix all 25 findings from second adversarial review The big two: - Arch installs work again: linux/arch/packages.list still listed exa, delta, and neofetch (renamed/removed from the repos) and swayfx (AUR only), so a default ./install.sh on Arch aborted before installing anything. Renamed to eza/git-delta, moved swayfx to a documented AUR section, added ttf-firacode-nerd (the configs require it; also added the font cask to the Brewfile), and the pacman step now uses --needed with a warning guard instead of aborting the whole install. - vim plugins actually install now: the round-1 `</dev/null` guard made `vim +PlugInstall` deterministically die reading input, so vim-only machines (every Linux box - neovim is Brewfile-only) silently got zero plugins. install.sh now pre-seeds vim-plug and uses the ex-mode recipe (vim -e -N -u vimrc --not-a-term -c 'PlugInstall --sync'), verifies plugged/ is non-empty, and compile_coc_nvim no longer claims success when it skipped a half-cloned coc.nvim. Verified: 10/10 plugins land in a fresh HOME (was 0/10). Hooks (all verified by staged-file reproduction): - Conflict-marker and generated-file checks no longer silently pass files larger than the pipe buffer (grep -q early-exit SIGPIPEs git show, which pipefail turned into "no match"); single full-input grep with captured output instead. - basename -- handles dash-leading filenames (a staged "-sneaky.pem" bypassed the secret check); secret list extended (id_dsa/ecdsa/ ed25519_sk, *.p8, *.jks, *.keystore, .netrc, .pgpass). - Lockfiles (Cargo.lock, poetry.lock, yarn.lock, ...) are allowlisted - their generated-by headers blocked every lockfile commit in every repo. - Repo-hook delegation (.husky etc.) gets an explicit trust switch: git config jm.hooks.runRepoHooks false disables running repo-controlled code in untrusted clones (default stays on). Portability and configs: - .zshrc shell-functions glob gets the (N) null-glob qualifier (zsh aborted mid-rc when the dir was empty, skipping kctx and .zshrc.local). - .gnu_aliases only evals dircolors when a real binary exists (macOS without coreutils printed an error on every shell startup). - Sway config had a literal @sysconfdir@ autotools placeholder, so /etc/sway/config.d drop-ins never loaded. - Waybar docker/k8s modules poll every 30s (was 10s) and only when dockerd runs / a kube-context is set (exec-if), instead of unconditionally at every desktop startup. - Shared ssh github.com block drops IdentitiesOnly so a machine missing the pinned key falls back to agent keys instead of bricking GitHub access; ForwardAgent trade-off documented in the README. - Arch kitty overlay goes through install_file (backup + audit + dry-run symmetry) and manjaro is treated like arch everywhere. Docs made truthful: shell-functions README rewritten around the 5 active files vs 11 disabled stubs, CLAUDE.md no longer points at a ~/MACHINE-STATE.md nothing creates (and drops the machine-specific repo path), color-linux-box.md gets the historical status header, arch README documents the opt-in pacman hook substitution, quick-install wording matches what it does, refresh-machine-state.sh detects alpine. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * rc files end with explicit if-blocks so sourcing reports status 0 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix all 33 findings from third adversarial review The big ones: - vim plugins genuinely install on vim-only machines now: vim-plug cannot run in ex mode (E31, installs nothing - the nvim pass on this laptop had been masking it by sharing ~/.vim/plugged), so headless installs allocate a pty via script(1) (BSD and util-linux forms). When nvim is present the vim invocation is skipped entirely; both paths report installed-vs-declared plugin counts instead of a non-empty-dir guess, vim-plug downloads atomically (a truncated plug.vim could previously never heal), and compile_coc_nvim warns when coc.nvim was requested but never cloned. Verified: 9/9 plugins in a fresh vim-only HOME. - install_file replaces symlinked ancestors that resolve into the repo: a legacy ~/.vim -> repo/.vim symlink previously made the installer DELETE the repo's own files and copy sources onto themselves - this is the exact migration path both real machines could hit. Verified against a repo copy: symlink becomes a real dir, repo untouched. - quick-install.sh / ssh-copy-dotfiles.sh / minimal-bashrc.sh installed a gitconfig whose core.hooksPath pointed at a directory they never populated, silently disabling ALL git hooks (including repo husky hooks) on machines set up that way. All three now install the hooks; quick-install also detects SSH sessions for server configs. - install_ai_context no longer clobbers a user-curated ~/.claude/ CLAUDE.md (seeded only when absent), skips minimal mode along with the sudo-askpass helper, and covers rhel/centos. Hooks: the jm.hooks.runRepoHooks off-switch now honors git boolean spellings (0/no/off previously failed open on the security control); documented in both READMEs. Desktop: rofi theme actually loads (new config.rasi - nothing referenced theme.rasi), sway screenshot binding invokes grim/slurp instead of a nonexistent sshot (grim+slurp added to packages.list), sway's literal @sysconfdir@ include fixed, spotify.sh paused/stopped branches were command invocations not assignments (+bash shebang for its [[ ]]), storage-workspace.sh no longer hardcodes /home/jm and hides cleanly when the mount is absent, dead files removed (sway/key-bindings, waybar cpu-graph.sh, docker-k8s.py - nothing referenced them), GTK's Nordic theme noted as AUR, pacman hook runs refresh as the owning user via runuser (root-owned repo files otherwise), version_of passes multi-flag commands correctly. Also: neovim added to all Linux package lists (README promised Neovim-first; only the Brewfile delivered it), ui-features.vim is actually sourced (installed but dead), .bashrc.server gets the .bashrc.local hook, nvim dry-run preview matches the real steps, install.sh header tells the truth, README file table covers vim/nvim/ askpass, minimal-mode behavior documented, combined-plan.md gets its historical banner. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
source ~/.local/bin/envin .zshrc and .bashrcTest plan
./install.sh --dry-runon macOS and Linux to verify no errors./install.shon Arch Linux and verify Kitty loads purple theme with Iosevka font./install.shon macOS and verify Kitty loads Catppuccin Mocha (unchanged)🤖 Generated with Claude Code