Skip to content
just-be-devPublic

About

Where my work happens

Resources

Stars

37 stars

Watchers

0 watching

Forks

Latest commit

 

History

72 Commits

Folders and files

Repository files navigation

workspace

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.

What's inside

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 —
herdr/plugin-config/jhochenbaum.hunkdiff/config.toml Herdr plugin config: hunk review round-trip mise.toml -> jhochenbaum/herdr-hunk-diff ~/.config/herdr/plugins/config/jhochenbaum.hunkdiff/config.toml
— herdr-projects coordinator and worktree plugin post-tools hook -> herdr plugin install —
herdr-mirror/hosts.toml herdr-mirror remote host config [dotfiles] ~/.config/herdr-mirror/hosts.toml
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
pi/agent/settings.json pi settings seed post-tools hook -> pi/seed-settings.sh copied once to ~/.pi/agent/settings.json (machine-local)
pi/agent/mcp.json pi built-in MCP servers (config only) ~/.pi/agent/mcp.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

Global tools

The CLI tools (herdr, hunk, ghui, pi, stylua, atuin, and Rust) 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.

Overlaying onto omarchy

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 *.lua glob links init.lua (skipping the nvim-managed lazy-lock.json / lazyvim.json lockfiles), and symlink-each links our files under lua/config/ and lua/plugins/. omarchy keeps options.lua, themes, transparency, remote-clipboard, etc.
  • pi extensions/ — symlink-each overlays 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.

pi is the agent harness. Its tracked config is a settings.json seed (preferences + package list), mcp.json (built-in MCP servers), and the extensions/ directory. The live settings file is machine-local, not symlinked; MCP config and extensions remain shared. Secrets and runtime state — auth.json, mcp-auth.json, sessions/, npm/, trust.json — stay in ~/.pi/agent/ and are never tracked.

Pi sessions and machine-local defaults

  • /clear starts an empty session while keeping the current model and thinking level. /new retains Pi's normal behavior: start with configured defaults.
  • The bootstrap seeds ~/.pi/agent/settings.json with Opus 5.5 (anthropic/claude-opus-5-5) only if no settings exist. It also converts the old workspace settings symlink to a local file, preserving its contents. Existing local settings are never overwritten on reruns.
  • On the personal machine, the local default is GPT 6.1 (openai-codex/gpt-6.1-sol). Work machines keep the Opus seed. To change a machine's default, open /model and press Ctrl+S on the desired model. Resuming a session restores that session's recorded model instead.
  • Preferences and package selections are now local too. Change them through /settings, the local JSON file, or pi install; subsequent seed changes do not automatically sync into existing settings.

For an existing checkout, migrate settings without running the full bootstrap:

sh pi/seed-settings.sh

Run /reload after updating extensions. Regression tests (Bun and Pi required):

bun test pi/tests

Skills live in the shared ~/.agents/skills/ directory (read by 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 matching [dotfiles] entries in mise.toml.

Install

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.sh

Once 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:

  1. installs system packages,
  2. applies [dotfiles] where targets are missing or already managed,
  3. confirms the global tools are installed and runs the post-tools hook: installs fish, installs Ghostty on macOS if missing, installs/links Herdr plugins, copies the Ghostty config, and seeds/migrates machine-local Pi settings.

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.

About

Where my work happens

Resources

Stars

37 stars

Watchers

0 watching

Forks

Contributors

Languages