This is the configuration for the tools I use for agent driven development.
I'm trending towards doing as much in the terminal as I can and biasing towards tools with high levels of customizability.
Uses the fantasic mise to bootstrap everything.
| Path | Tool | Installed by | Symlinked to |
|---|---|---|---|
mise/workspace.toml |
Global mise tool config | [dotfiles] |
~/.config/mise/conf.d/workspace.toml |
herdr/config.toml |
herdr | mise/workspace.toml -> herdr |
~/.config/herdr/config.toml |
herdr/plugins/dev-layout/ |
Herdr plugin: four-pane dev layout | post-tools hook -> herdr plugin link |
— |
nvim/ |
LazyVim | mise/workspace.toml -> neovim (macOS; omarchy on Linux) |
~/.config/nvim (overlay) |
ghostty/config |
Ghostty | post-tools hook (brew --cask) |
~/.config/ghostty/config (macOS only) |
ghui/config.json |
ghui | mise/workspace.toml -> npm:@kitlangton/ghui |
~/.config/ghui/config.json |
hunk/config.toml |
hunk | mise/workspace.toml -> hunk |
~/.config/hunk/config.toml |
omp/agent/config.yml |
omp | mise/workspace.toml -> github:can1357/oh-my-pi |
~/.omp/agent/config.yml |
omp/agent/extensions/ |
omp extensions | (config only) | ~/.omp/agent/extensions (overlay) |
omp/plugins/pi-claude-bridge/ + .tgz |
OMP plugin: Claude Code provider + AskClaude tool | post-tools hook -> npm install packaged local plugin |
~/.omp/plugins/node_modules/pi-claude-bridge |
pi/agent/settings.json |
pi | mise/workspace.toml -> npm:@earendil-works/pi-coding-agent |
~/.pi/agent/settings.json |
pi/agent/extensions/ |
pi extensions | (config only) | ~/.pi/agent/extensions (overlay) |
skills/effect-setup/ |
agent skill | (config only) | ~/.agents/skills/effect-setup |
skills/mise-setup/ |
agent skill | (config only) | ~/.agents/skills/mise-setup |
The CLI tools (herdr, hunk, ghui, omp, pi, stylua, atuin) are declared in
mise/workspace.toml. The main mise.toml
symlinks that file to ~/.config/mise/conf.d/workspace.toml, making those tools
global instead of repo-local. A few tools (neovim, gh, claude-code, fzf,
lazygit) are scoped to macOS only — on Arch/omarchy the system already provides
them, so mise stays out of the way.
Only config is tracked. Runtime files (logs, sockets, state.json, caches,
session.json) stay out.
On Linux this machine runs omarchy, which ships its own
base configs. Where a config directory is shared with omarchy, the [dotfiles]
entries overlay our files rather than replacing the whole directory, leaving
omarchy's siblings untouched:
- nvim — a top-level
*.luaglob linksinit.lua(skipping the nvim-managedlazy-lock.json/lazyvim.jsonlockfiles), andsymlink-eachlinks our files underlua/config/andlua/plugins/. omarchy keepsoptions.lua, themes, transparency, remote-clipboard, etc. - omp / pi
extensions/—symlink-eachoverlays our tracked extensions file-by-file, leaving tool-installed ones (e.g.omarchy-system-theme.ts) in place. - ghostty — not a
[dotfiles]entry (those can't be OS-scoped). On Linux omarchy's managed config is left alone; on macOS the post-tools hook copies ours in.
omp is the default agent setup. Only non-secret config is tracked:
config.yml, the extensions directory, and the local pi-claude-bridge
plugin source plus packaged tarball. OAuth credentials and runtime state stay in
~/.omp/agent/agent.db and related files; authenticate with /login or provider
environment variables after bootstrap.
pi is also installed and configured as a secondary agent. Its tracked
config is settings.json (preferences + package list) and the extensions/
directory. Secrets and runtime state — auth.json, sessions/, npm/,
trust.json — stay in ~/.pi/agent/ and are never tracked.
Skills live in the shared ~/.agents/skills/ directory (read by omp, pi, and other
agents). That directory also holds skills installed by a skill manager, so each
tracked skill under skills/ is symlinked individually rather than
linking the whole directory. Add a skill by dropping its folder in skills/ and
adding a matching [dotfiles] entry in mise.toml.
From a fresh clone, run the install script. It installs mise if missing, then
prints a per-item plan (mise bootstrap status) and waits for confirmation
before changing anything — the only thing that runs before you confirm is the
mise install itself. Re-running is safe — mise converges each step and skips
work already done:
./install.shOnce you confirm, the install script first links
~/.config/mise/conf.d/workspace.toml with a plain dotfile apply, then starts a
fresh mise bootstrap. It intentionally does not pass --force-dotfiles:
conflicting real files stay visible in the plan instead of being clobbered by
the installer.
The bootstrap then converges the normal mise parts:
- installs system packages,
- applies
[dotfiles]where targets are missing or already managed, - confirms the global tools are installed and runs the post-tools hook: installs fish, installs Ghostty on macOS if missing, links the local Herdr plugin, installs the local omp plugin, and copies the Ghostty config.
If a dotfile target is reported as differs, resolve it explicitly after
reviewing the file. For unattended runs set WORKSPACE_ASSUME_YES=1 to skip
the prompt; to inspect without the script, mise bootstrap status and
mise bootstrap --dry-run both change nothing.