Managed by chezmoi. Source lives here; rendered
targets land under ~/. This repo is public — see the secrets rules
in CLAUDE.md before adding anything.
Authored agent skills live in a separate repo: rexarski/skills (see “skills” below).
~/.local/share/chezmoi/
├── README.md, CLAUDE.md repo docs (in .chezmoiignore, never applied)
├── scripts/ repo-only helpers (in .chezmoiignore;
│ ├── update-skills.fish run from here, not rendered into ~/)
│ └── list-uncaptured-skills.fish
├── dot_Brewfile → ~/.Brewfile (curated bootstrap deps)
├── run_onchange_install-packages.sh.tmpl runs `brew bundle --global` when
│ the Brewfile changes
├── dot_gitignore_global → ~/.gitignore_global
├── private_dot_gitconfig.tmpl → ~/.gitconfig (template; portable paths)
│
├── private_dot_ssh/ → ~/.ssh/
│ ├── id_ed25519.pub signing pubkey (1Password holds the key)
│ └── allowed_signers lets `git log --show-signature` verify
│
├── dot_agents/ → ~/.agents/
│ └── private_dot_skill-lock.json pins every installed skill
│
├── dot_claude/ → ~/.claude/
│ ├── private_settings.json hooks, plugins, statusline config
│ ├── executable_statusline-command.sh
│ └── hooks/executable_context-mode-cache-heal.mjs
│
├── dot_config/ → ~/.config/
│ ├── btop/btop.conf (save_config_on_exit off — keep it so)
│ ├── gh/private_config.yml (hosts.yml deliberately NOT tracked)
│ ├── private_fish/ config.fish, fish_plugins, tide config
│ └── zed/private_settings.json
│
└── private_Library/…/com.mitchellh.ghostty/config
Naming conventions: dot_X → .X · private_X → mode 0600 ·
executable_X → mode 0755 · X.tmpl → rendered Go template.
chezmoi diff # preview pending changes (source → target)
chezmoi -v apply # write source to target, verbose
chezmoi re-add <path> # pull a locally-edited target back into source
chezmoi add <path> # start tracking a new file
chezmoi forget <path> # stop tracking (leaves target intact)
chezmoi cd # cd into this source dir
chezmoi managed # list every target chezmoi ownsWhen apply prompts diff/overwrite/all-overwrite/skip/quit:
- Local edits you want to keep →
quit, thenchezmoi re-add <path>. - Want to discard local edits →
overwrite.
On the machine where you made changes:
chezmoi cd
git add -p; git commit; git push # conventional commits, signedOn every other machine:
chezmoi update -v # git pull + apply in one step
~/.local/share/chezmoi/scripts/update-skills.fish # if .skill-lock.json changedchezmoi update fails politely if the local source repo is dirty — commit
or stash there first. If apply hits a prompt, follow the protocol above.
Everything is lockfile-tracked — there is no separate “local-only” tree.
-
~/.agents/skills/— real skill dirs, owned by theskillsCLI. It prunes anything not in.skill-lock.json, which is fine because every skill (including authored ones) comes from a tracked repo. -
Authored ("local-only") skills live in rexarski/skills (local clone:
~/Developer/skills). To load them on any machine:skills add rexarski/skills -g -y
That installs them into
~/.agents/skills/, records them in the lockfile, and symlinks them into each agent's skill dir — same as any third-party pack. -
~/.claude/skills/etc. — symlinks, created and maintained by theskillsCLI itself.
Helper scripts live in this repo (scripts/, not rendered into ~/):
set src ~/.local/share/chezmoi
# reinstall/refresh everything in the lockfile
$src/scripts/update-skills.fish # or a subset: update-skills.fish hugo pdf
# raw CLI
skills check / update / list
skills add <owner>/<repo> -g -y
skills remove -s <name> -g -y
# drift audit: anything listed here would be pruned on the next CLI run —
# it belongs in rexarski/skills (or another pack) instead
$src/scripts/list-uncaptured-skills.fishAuthor or edit a skill:
cd ~/Developer/skills # edit skills/<name>/SKILL.md
git add -A; git commit; git push
skills add rexarski/skills -g -y # refresh installed copy
chezmoi re-add ~/.agents/.skill-lock.json # commit lockfile change here# 1. Homebrew (https://brew.sh), then:
brew install chezmoi
chezmoi init --apply rexarski/dotfiles
# └─ writes all configs AND runs run_onchange_install-packages:
# brew bundle --global + npm install -g skills
# 2. skills
~/.local/share/chezmoi/scripts/update-skills.fish
# # materialize every lockfile-tracked skill
skills add rexarski/skills -g -y # ensure authored (local-only) skills load
# 3. commit signing (see next section)Commits are SSH-signed via 1Password's op-ssh-sign. The gitconfig is a
template — pubkey paths render against {{ .chezmoi.homeDir }} per machine.
- Install + sign in to 1Password; enable
Developer → Use the SSH agent. ~/.ssh/id_ed25519.puband~/.ssh/allowed_signersare already written bychezmoi apply(public info, safe in source).- Verify:
cd ~/.local/share/chezmoi git commit --allow-empty -m "test: signing" git log --show-signature -1 # expect: Good "git" signature git reset --hard HEAD^
If the pubkey rotates:
set sock ~/Library/Group\ Containers/2BUA8C4S2C.com.1password/t/agent.sock
env SSH_AUTH_SOCK=$sock ssh-add -L | grep '^ssh-ed25519' > ~/.ssh/id_ed25519.pub
awk '{print "rexarski@gmail.com " $0}' ~/.ssh/id_ed25519.pub > ~/.ssh/allowed_signers
chezmoi re-add ~/.ssh/id_ed25519.pub ~/.ssh/allowed_signers