From dbdef02659f159cd2e69455abf0c8b66be977b6a Mon Sep 17 00:00:00 2001 From: Unique Divine Date: Sat, 8 Aug 2026 20:10:52 -0500 Subject: [PATCH 1/7] tmux: Start agent-watch and show activity on window labels --- tmux/tmux.conf | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tmux/tmux.conf b/tmux/tmux.conf index 1216455..28ac738 100644 --- a/tmux/tmux.conf +++ b/tmux/tmux.conf @@ -174,4 +174,15 @@ set -g @dracula-git-colors "cyan dark_gray" # Init TMUX plugin manager (⚠️ keep at the bottom of ~/.tmux.conf). run '~/.tmux/plugins/tpm/tpm' +# Start one watcher for this tmux server when the optional binary is installed. +# The watcher lock makes repeated config reloads harmless. +run-shell -b 'if [ -x "$HOME/.local/bin/tmux-agent-watch" ]; then exec "$HOME/.local/bin/tmux-agent-watch" --socket-path #{q:socket_path} watch >/dev/null 2>&1; fi' + +# Append tmux-agent-watch activity counts to each window label. The watcher +# owns user option @agent_watch_summary; an absent or stopped watcher is blank. +set -g window-status-format \ + "#[fg=#f8f8f2]#[bg=#44475a] #I #W#{@agent_watch_summary}" +set -g window-status-current-format \ + "#[fg=#44475a]#[bg=#6272a4]#[fg=#f8f8f2]#[bg=#6272a4] #I #W#{@agent_watch_summary} #[fg=#6272a4]#[bg=#44475a]" + set -g status-style bg=default From aa7da205769b99b7d74867721d911dc8ad427a1c Mon Sep 17 00:00:00 2001 From: Unique Divine Date: Sat, 8 Aug 2026 20:11:34 -0500 Subject: [PATCH 2/7] codex: Prefer single quotes in config test fixtures --- codex/config.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codex/config.test.ts b/codex/config.test.ts index 5ce1682..bde89be 100644 --- a/codex/config.test.ts +++ b/codex/config.test.ts @@ -119,9 +119,9 @@ describe("codex config", () => { await writeFile( runtimePath, '[projects."/tmp/project"]\ntrust_level = "trusted"\n\n' + - "[mcp_servers.private]\ncommand = \"private-command\"\n\n" + + '[mcp_servers.private]\ncommand = "private-command"\n\n' + "[tui]\nvim_mode_default = false\n\n" + - "[tui.model_availability_nux]\n\"gpt-5.6-sol\" = 4\n", + '[tui.model_availability_nux]\n"gpt-5.6-sol" = 4\n', ) await applyConfig({ runtimePath, mcpSourcePath, quiet: true }) From 2441514846dc26e9610ac7c1727f5be17e2a5613 Mon Sep 17 00:00:00 2001 From: Unique Divine Date: Sat, 8 Aug 2026 20:11:56 -0500 Subject: [PATCH 3/7] windows: Add Explorer classic context-menu setup for WSL --- windows/cfg.sh | 14 ++++++++++++++ windows/explorer.ps1 | 24 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100755 windows/cfg.sh create mode 100644 windows/explorer.ps1 diff --git a/windows/cfg.sh b/windows/cfg.sh new file mode 100755 index 0000000..5ebe934 --- /dev/null +++ b/windows/cfg.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" + +run_ps1() { + powershell.exe \ + -NoProfile \ + -ExecutionPolicy Bypass \ + -File "$(wslpath -w "$1")" +} + +run_ps1 "$script_dir/explorer.ps1" diff --git a/windows/explorer.ps1 b/windows/explorer.ps1 new file mode 100644 index 0000000..c8098e3 --- /dev/null +++ b/windows/explorer.ps1 @@ -0,0 +1,24 @@ +# windows/explorer.ps1 + +$ErrorActionPreference = "Stop" + +Write-Host "Configuring Windows Explorer..." + +# Use the classic/full context menu by default. +# On newer Windows 11 PCs, right clicking a file in the explorer opens requires +# selecting "Show more options" to access setting I often need. Ihe code below +# gives the classic experience from prior to Windows 11 defaults. +$classicContextMenuKey = + "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" + +if (-not (Test-Path $classicContextMenuKey)) { + New-Item -Path $classicContextMenuKey -Force | Out-Null +} + +# The default value must exist and be empty. +Set-Item -Path $classicContextMenuKey -Value "" + +Write-Host "Explorer configuration applied." + +# Restart Explorer so the setting takes effect immediately. +Stop-Process -Name explorer -Force From 9e1d7a33ce9df2994064651272be7a78eb1228b8 Mon Sep 17 00:00:00 2001 From: Unique Divine Date: Sat, 8 Aug 2026 20:12:01 -0500 Subject: [PATCH 4/7] zsh: Sort bashlib test imports --- justfile | 2 +- zsh/bashlib.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/justfile b/justfile index bd0092a..29d01bf 100644 --- a/justfile +++ b/justfile @@ -58,7 +58,7 @@ codex *ARGS: # Install baseline Ubuntu/WSL shell dependencies. i-bash: sudo apt install -y build-essential ripgrep gh libclang-dev wslu \ - ca-certificates gnupg curl trash-cli clang-format + ca-certificates gnupg curl trash-cli clang-format sqlite3 # Install shell dependencies needed by CI tests. i-bash-ci: diff --git a/zsh/bashlib.test.ts b/zsh/bashlib.test.ts index 2416e14..80510a7 100644 --- a/zsh/bashlib.test.ts +++ b/zsh/bashlib.test.ts @@ -1,6 +1,6 @@ -import { bash } from "@uniquedivine/bash" import { mkdir, rm, writeFile } from "node:fs/promises" import { join } from "node:path" +import { bash } from "@uniquedivine/bash" import { afterAll, beforeAll, describe, expect, test } from "bun:test" const bashlibPath = join(import.meta.dir, "bashlib.sh") From 79818c3c4991915512c5112bb7a36fb58455c06a Mon Sep 17 00:00:00 2001 From: Unique Divine Date: Sat, 8 Aug 2026 20:18:16 -0500 Subject: [PATCH 5/7] tmux: Fix powerline corner bleed with transparent status bg --- tmux/tmux.conf | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tmux/tmux.conf b/tmux/tmux.conf index 28ac738..0dd5e28 100644 --- a/tmux/tmux.conf +++ b/tmux/tmux.conf @@ -149,6 +149,10 @@ set -g @plugin 'tmux-plugins/tmux-continuum' set -g @dracula-plugins "cpu-usage network-ping time git" # set -g @dracula-plugins "git cpu-usage ram-usage network-ping" set -g @dracula-show-powerline true +# Match powerline separator cell backgrounds to a transparent status bar. +# Without this, Dracula paints / cells with gray #44475a and the unused +# corners of those rectangular cells stick out when status-style is default. +set -g @dracula-transparent-powerline-bg true # Switch left smiley icon. Accepts: ["session", "smiley", "window", or any # character] set -g @dracula-show-left-icon session @@ -180,9 +184,10 @@ run-shell -b 'if [ -x "$HOME/.local/bin/tmux-agent-watch" ]; then exec "$HOME/.l # Append tmux-agent-watch activity counts to each window label. The watcher # owns user option @agent_watch_summary; an absent or stopped watcher is blank. +# Use bg=default + inverse divider so these match transparent powerline mode. set -g window-status-format \ - "#[fg=#f8f8f2]#[bg=#44475a] #I #W#{@agent_watch_summary}" + "#[fg=#f8f8f2]#[bg=default] #I #W#{@agent_watch_summary}" set -g window-status-current-format \ - "#[fg=#44475a]#[bg=#6272a4]#[fg=#f8f8f2]#[bg=#6272a4] #I #W#{@agent_watch_summary} #[fg=#6272a4]#[bg=#44475a]" + "#[fg=#6272a4]#[bg=default]#[fg=#f8f8f2]#[bg=#6272a4] #I #W#{@agent_watch_summary} #[fg=#6272a4]#[bg=default]" set -g status-style bg=default From be746c81f4941aee5d86c9b142c6bbe8689e1f3e Mon Sep 17 00:00:00 2001 From: Unique Divine Date: Sun, 9 Aug 2026 22:39:13 -0500 Subject: [PATCH 6/7] herdr: Add managed configuration baseline --- .gitmodules | 3 + README.md | 23 ++++ herdr/config.toml | 329 ++++++++++++++++++++++++++++++++++++++++++++++ justfile | 16 +++ lib-herdr | 1 + symlinks.sh | 2 + 6 files changed, 374 insertions(+) create mode 100644 .gitmodules create mode 100644 herdr/config.toml create mode 160000 lib-herdr diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a12beaa --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib-herdr"] + path = lib-herdr + url = https://github.com/herdrdev/herdr.git diff --git a/README.md b/README.md index 3ca4137..51a35d3 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ machines. - [AI agent skills](#ai-agent-skills) - [Neovim Configuration](#neovim-configuration) - [Terminal Environment: tmux, zsh, bun](#terminal-environment-tmux-zsh-bun) + - [Herdr configuration](#herdr-configuration) - [Codex config](#codex-config) - [WSL Clipboard Integration](#wsl-clipboard-integration) - [Requirements](#requirements) @@ -106,6 +107,28 @@ See the [Codex skills documentation](https://developers.openai.com/codex/concept - Bun JavaScript/TypeScript runtime integration - `tree-sitter-cli` support for Neovim parser installation on the `main` branch +### Herdr configuration + +[`herdr/config.toml`](herdr/config.toml) is the managed configuration source. +`symlinks.sh` links only this file to `~/.config/herdr/config.toml`; Herdr's +sessions and logs remain runtime-owned and are never linked or versioned. +Like the existing dotfiles links, sync replaces the runtime config with this +managed source. Backup/preservation or force-mode policies are deferred. + +The checked-in file is the complete annotated baseline generated by Herdr +0.8.0. Its options are commented except for upstream's explicit +`pane_history = false` default, so it preserves built-in behavior until an +option is deliberately changed. Refresh it only when deliberately adopting a +new Herdr baseline: + +```bash +herdr --default-config +``` + +The upstream source is available as the pinned `lib-herdr` submodule for local +documentation and implementation inspection. Initialize it after cloning +dotfiles with `git submodule update --init --recursive`. + ### Codex config [`codex/config.ts`](codex/config.ts) maintains portable defaults in diff --git a/herdr/config.toml b/herdr/config.toml new file mode 100644 index 0000000..86a7e3e --- /dev/null +++ b/herdr/config.toml @@ -0,0 +1,329 @@ +# Managed baseline generated by `herdr --default-config` from Herdr 0.8.0. +# Keep options commented until intentionally overriding a default; preserve +# explicit upstream defaults such as `pane_history = false`. +# Regenerate against the installed binary when deliberately adopting a newer Herdr baseline. + +# herdr configuration +# Place this file at ~/.config/herdr/config.toml + +# Show first-run notification setup on startup. +# Missing also shows onboarding; set false after you've chosen. +# onboarding = true + +[theme] +# Built-in themes: catppuccin, terminal, tokyo-night, dracula, nord, +# gruvbox, one-dark, solarized, kanagawa, rose-pine, +# vesper +# name = "catppuccin" + +# Follow host terminal light/dark appearance and switch Herdr UI themes. +# Existing manual behavior is unchanged unless this is true. +# auto_switch = false +# dark_name = "catppuccin" +# light_name = "catppuccin-latte" + +# Override individual color tokens on top of the base theme. +# Accepts: hex (#rrggbb), named colors, rgb(r,g,b), or panel_bg = "reset" +# [theme.custom] +# panel_bg = "reset" +# accent = "#f5c2e7" +# red = "#ff6188" +# green = "#a6e3a1" + +[terminal] +# Executable used for new interactive panes. +# Empty means $SHELL, then /bin/sh. +# default_shell = "" + +# Startup mode for new interactive pane shells: "auto", "login", or "non_login". +# "auto" uses login shells on macOS and keeps the current behavior elsewhere. +# shell_mode = "auto" + +# CWD policy for new panes, tabs, and workspaces when no explicit --cwd is provided. +# Use "follow" to inherit the source pane/workspace, "home" for $HOME, +# "current" for Herdr's process directory, or a fixed path such as "~/Projects". +# new_cwd = "follow" + +[update] +# Update channel used by background version checks and `herdr update`. +# Defaults to "stable" on Linux/macOS and "preview" on Windows. +# Set explicitly to choose stable releases or opt-in preview builds. +# channel = "stable" + +# Check herdr.dev for new Herdr versions in the background. +# version_check = true + +# Check herdr.dev for remote agent-detection manifest updates in the background. +# manifest_check = true + +[keys] +# Prefix key to enter prefix mode (default: "ctrl+b") +# Examples: "ctrl+b", "f12", "esc", "-" +# Action bindings use explicit syntax: "prefix+n" requires the prefix; +# "ctrl+alt+n" is a direct terminal-mode shortcut. +# Accepted key syntax: plain keys, ctrl/shift/alt/cmd/super modifiers, and special keys like enter/tab/esc/left/right/up/down. +# Named punctuation such as minus, comma, ampersand, plus, and backtick is also accepted. +# Most reliable direct bindings are ctrl+letter, function keys, and explicit modified chords. +# alt+..., cmd/super, and punctuation-with-modifiers may depend on your terminal/tmux setup. +# prefix = "ctrl+b" + +# Prefix-mode actions +# help = "prefix+?" +# settings = "prefix+s" +# detach = "prefix+q" +# reload_config = "prefix+shift+r" +# open_notification_target = "prefix+o" +# workspace_picker = "prefix+w" +# goto = "prefix+g" +# new_workspace = "prefix+shift+n" +# new_worktree = "prefix+shift+g" +# open_worktree = "" # optional, unset by default +# remove_worktree = "" # optional, unset by default; opens confirmation +# rename_workspace = "prefix+shift+w" +# close_workspace = "prefix+shift+d" +# previous_workspace = "" # optional, unset by default +# next_workspace = "" # optional, unset by default +# previous_agent = "" # optional, unset by default +# next_agent = "" # optional, unset by default +# focus_agent = "" # optional indexed binding, e.g. "prefix+alt+1..9" +# remote_image_paste = "ctrl+v" # only active in herdr --remote; empty disables raw-key image paste +# new_tab = "prefix+c" +# rename_tab = "prefix+shift+t" +# previous_tab = "prefix+p" +# next_tab = "prefix+n" +# switch_tab = "prefix+1..9" +# switch_workspace = "" # optional indexed binding, e.g. "prefix+shift+1..9" +# close_tab = "prefix+shift+x" +# rename_pane = "prefix+shift+p" +# edit_scrollback = "prefix+e" +# focus_pane_left = "prefix+h" +# focus_pane_down = "prefix+j" +# focus_pane_up = "prefix+k" +# focus_pane_right = "prefix+l" +# cycle_pane_next = "prefix+tab" +# cycle_pane_previous = "prefix+shift+tab" +# last_pane = "" # optional, unset by default; bind e.g. "prefix+tab" for global back-and-forth +# split_vertical = "prefix+v" +# split_horizontal = "prefix+minus" +# close_pane = "prefix+x" +# zoom = "prefix+z" # legacy alias: fullscreen +# resize_mode = "prefix+r" +# toggle_sidebar = "prefix+b" + +# Navigate-mode movement. These local shortcuts win while navigate mode is open. +# They are independent from focus_pane_*. Do not include prefix+, esc, enter, tab, or 1..9 here. +# navigate_workspace_up = "up" +# navigate_workspace_down = "down" +# navigate_pane_left = "h" # left arrow always focuses the pane to the left +# navigate_pane_down = "j" +# navigate_pane_up = "k" +# navigate_pane_right = "l" # right arrow always focuses the pane to the right + +# Custom commands use the same binding syntax. +# type = "shell" runs detached in the background. +# type = "pane" opens a temporary pane and closes it when the command exits. +# type = "popup" opens a session-modal terminal without changing the tab layout. +# Popup width and height accept terminal cells or percentages such as "80%". +# On Windows, command strings run through cmd.exe /d /c. +# [[keys.command]] +# key = "prefix+alt+g" +# type = "popup" +# command = "lazygit" +# width = "80%" +# height = "80%" + +# Legacy indexed shortcut config is still parsed for compatibility. +# Prefer switch_tab, switch_workspace, and focus_agent for new configs. +# [keys.indexed] +# tabs = "" # e.g. "ctrl" makes ctrl+1..9 switch tabs directly +# workspaces = "" # e.g. "ctrl+shift" makes ctrl+shift+1..9 switch workspaces directly +# agents = "" # e.g. "alt" makes alt+1..9 focus agent rows directly + +# [worktrees] +# directory = "~/.herdr/worktrees" + +[ui] +# Sidebar width (auto-scaled based on workspace names, this sets the default) +# sidebar_width = 26 + +# Minimum sidebar width when expanded (columns) +# sidebar_min_width = 18 + +# Maximum sidebar width when expanded (columns) +# sidebar_max_width = 36 + +# Start with the sidebar collapsed. Changes take effect on the next launch. +# sidebar_start_collapsed = false + +# Collapsed sidebar presentation: "compact" keeps the narrow status rail, "hidden" uses zero width. +# sidebar_collapsed_mode = "compact" + +# Terminal width at or below which Herdr uses the mobile single-column layout. +# Increase this for foldables, tablets, or wide phone terminals. +# mobile_width_threshold = 64 + +# Capture mouse input for Herdr's mouse UI. +# Set false to let the terminal handle normal clicks, such as Cmd-clicking URLs. +# Pane apps like lazygit and btop can still receive mouse when they request it. +# mouse_capture = true + +# Automatically copy text selected with the mouse. +# Set false to retain drag or double-click word selection until Ctrl+C, +# or Cmd+C when the host forwards it, copies and clears it. +# copy_on_select = true + +# Host cursor policy: "auto", "native", or "drawn". +# "auto" draws Herdr's own cursor on native Windows builds and WSL to avoid ConPTY cursor flicker, and uses the native terminal cursor elsewhere. +# "native" always uses the outer terminal cursor. "drawn" always draws Herdr's cursor as terminal cell content. +# host_cursor = "auto" + +# Optional modifier that forwards right-click hold/drag gestures to pane apps instead of opening Herdr's pane menu. +# Empty/off disables this. Shift is intentionally unsupported because terminals commonly reserve Shift+mouse. +# right_click_passthrough_modifier = "" + +# Force a full redraw when the outer terminal regains focus. +# Set false to reduce visible flashing when switching back to Herdr. +# Trade-off: rare host terminal surface corruption may persist until the next full redraw. +# redraw_on_focus_gained = true + +# Pane scrollback lines to scroll per mouse wheel notch. +# mouse_scroll_lines = 3 + +# Ask for confirmation before closing a workspace +# confirm_close = true + +# Ask for a tab name before creating a new tab. +# Set false to create tabs immediately with generated names. +# prompt_new_tab_name = true + +# Ask for a workspace name before interactive creation. +# prompt_new_workspace_name = false + +# Draw borders around split panes. +# pane_borders = true + +# Draw interactive scrollbars beside terminal panes. +# Set false to reclaim the scrollbar column and keep it out of terminal-native selections. +# pane_scrollbars = true + +# Keep split panes visually separated instead of sharing divider borders. +# pane_gaps = true + +# Show detected/reported agent labels in split pane borders when no manual pane name is set. +# show_agent_labels_on_pane_borders = false + +# Hide the tab row when a workspace has exactly one tab. +# New tabs can still be created with the configured keybinding. +# hide_tab_bar_when_single_tab = false + +# Desktop tab row placement: "top" or "bottom". +# tab_bar_position = "top" + +# Agent panel ordering: "spaces" (grouped by space) or "priority" (attention queue). +# "workspaces" is accepted as an alias for "spaces". +# agent_panel_sort = "spaces" + +# Expanded agent rows. Built-ins are state_icon, state_text, workspace, tab, pane, agent, +# terminal_title, and terminal_title_stripped. +# Custom values reported through pane metadata use a $name token. +# A token occurrence may be styled with { token = "workspace", fg = "#89b4fa", bold = true, dim = false }. +# Omitted style fields preserve the contextual default. +# [ui.sidebar.agents] +# Blank rows between agent entries. Set to 1 to restore the previous spacing. +# row_gap = 0 +# rows = [["state_icon", "workspace", "tab"], ["agent"]] +# Optional canonical agent IDs replace the default rows for matching agents. +# [ui.sidebar.agents.rows_by_agent] +# claude = [["state_icon", "workspace", "tab"], ["terminal_title_stripped"], ["agent"]] + +# Expanded space rows. Built-ins are state_icon, state_text, workspace, branch, and git_status. +# Custom values reported through workspace metadata use a $name token, for example $jj_status. +# Inline token styles accept strict #RGB/#RRGGBB foregrounds plus bold and dim booleans. +# [ui.sidebar.spaces] +# Blank rows between space entries. Set to 1 to restore the previous spacing. +# row_gap = 0 +# rows = [["state_icon", "workspace"], ["branch", "git_status"]] + +# Accent color for highlights, borders, and navigation UI. +# Accepts: hex (#89b4fa), named colors (cyan, blue, magenta), or rgb(r,g,b) +# accent = "cyan" + +# Background notification popup delivery +[ui.toast] +# off = disable pop-up notifications +# herdr = show in-app toasts +# terminal = ask the outer terminal to show a desktop notification +# system = ask the OS notification service directly +# delivery = "off" +# delay_seconds = 1 + +[ui.toast.herdr] +# position = "bottom-right" + +[ui.toast.clipboard] +# enabled = true +# position = "bottom-center" + +# Play sounds when agents change state in background workspaces +[ui.sound] +# enabled = true +# Optional custom mp3 sound files. Relative paths are resolved from this config file's directory. +# path = "sounds/notification.mp3" # one mp3 file for all sound notifications +# done_path = "sounds/done.mp3" # overrides only finished notifications +# request_path = "sounds/request.mp3" # overrides only needs-attention notifications + +# Per-agent overrides: default | on | off +# By default, droid is muted. +# [ui.sound.agents] +# droid = "off" + +[session] +# Resume supported AI-agent panes into their native conversation sessions after +# a Herdr server restart. Requires official integrations that report session refs. +# resume_agents_on_restore = true + +[remote] +# Whether herdr manages the ssh config used for `herdr --remote`. +# When true (default), herdr runs remote ssh through a generated config that +# includes your ~/.ssh/config first and adds ServerAliveInterval/ +# ServerAliveCountMax as fallbacks (so any keepalive values you set yourself +# still win) to survive idle network/NAT timeouts. Herdr also uses a private +# per-attach OpenSSH control socket to reuse the first authenticated connection. +# Set false to run plain ssh against your ssh config unchanged — this does not +# force keepalive or multiplexing off, it only stops herdr from adding its own. +# manage_ssh_config = true + +[experimental] +# Allow launching herdr from inside a herdr-managed pane. +# allow_nested = false +# Experimental local Kitty graphics rendering for attached clients. +# Requires a Kitty graphics-compatible outer terminal. +# kitty_graphics = false +# Save recent pane screen history across full server restarts. +pane_history = false +# While prefix mode is active, temporarily switch the host input source to +# an ASCII-capable mode so prefix commands register even when an IME is +# active, then restore the previous input source when prefix mode exits. On +# macOS this selects the ASCII-capable keyboard layout; on Windows it toggles +# a Korean IME between Hangul and English (other IME languages are left +# unchanged). macOS and Windows only; best-effort. Default: false. +# switch_ascii_input_source_in_prefix = false +# Expose the focused pane's cursor to the outer terminal so macOS input +# methods keep tracking the candidate window when TUIs paint their own +# cursor (Claude Code, pi, codex). Trade-off: extra cursor visible for +# apps that hide it without painting a replacement (vim normal mode, etc.). +# reveal_hidden_cursor_for_cjk_ime = false +# Optional allow-list: only reveal for focused panes whose detected agent +# matches one of these names. Empty means apply to any focused pane. +# If the list contains no valid names, the reveal does not apply. +# Accepted: pi, claude, codex, gemini, cursor, devin, cline, opencode, +# copilot, kimi, kiro, droid, amp, grok, hermes, kilo, qodercli, qoder. +# cjk_ime_agents = [] +# Cursor shape rendered when reveal_hidden_cursor_for_cjk_ime is true. +# Values: block, steady_block (default), underline, steady_underline, bar, steady_bar. +# cjk_ime_cursor_shape = "steady_block" + +[advanced] +# Maximum scrollback buffer size in bytes retained per pane terminal. +# Matches Ghostty's default scrollback-limit behavior. +# scrollback_limit_bytes = 10000000 diff --git a/justfile b/justfile index 29d01bf..7dcdf1d 100644 --- a/justfile +++ b/justfile @@ -42,6 +42,22 @@ health: failed=1 fi + if which_ok herdr; then + herdr_config="$PWD/herdr/config.toml" + runtime_herdr_config="$HOME/.config/herdr/config.toml" + + if ! HERDR_CONFIG_PATH="$herdr_config" herdr config check; then + failed=1 + fi + + if [[ ! -L "$runtime_herdr_config" ]] || \ + [[ "$(readlink -f -- "$runtime_herdr_config" 2>/dev/null || true)" != \ + "$(readlink -f -- "$herdr_config")" ]]; then + log_error "Herdr config link is missing or points outside dotfiles: $runtime_herdr_config" + failed=1 + fi + fi + if [[ -z "${REPO:-}" ]]; then log_error "REPO is not set; run just sync first or source zsh/zshenv" failed=1 diff --git a/lib-herdr b/lib-herdr new file mode 160000 index 0000000..6c6ddcd --- /dev/null +++ b/lib-herdr @@ -0,0 +1 @@ +Subproject commit 6c6ddcd49384d6ea9f0ee2e63bf7b2643dfd5bcf diff --git a/symlinks.sh b/symlinks.sh index a1ea1cd..97330fa 100644 --- a/symlinks.sh +++ b/symlinks.sh @@ -36,6 +36,8 @@ _symlink "$DOTFILES/tmux/tmux.conf" ~/.tmux.conf mkdir -p ~/.config _symlink "$DOTFILES/nvim" ~/.config/ +mkdir -p ~/.config/herdr +_symlink "$DOTFILES/herdr/config.toml" ~/.config/herdr/config.toml source "$DOTFILES/zsh/bashlib.sh" source "$DOTFILES/env.sh" # For the $SUDO_PW env var From cd6222cc35ffa89873361422cdda68dbb5503d28 Mon Sep 17 00:00:00 2001 From: Unique Divine Date: Sun, 9 Aug 2026 22:42:17 -0500 Subject: [PATCH 7/7] herdr: Move detach to prefix+d --- herdr/README.md | 17 +++++++++++++++++ herdr/config.toml | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 herdr/README.md diff --git a/herdr/README.md b/herdr/README.md new file mode 100644 index 0000000..aa5d6b9 --- /dev/null +++ b/herdr/README.md @@ -0,0 +1,17 @@ +# Herdr configuration + +`config.toml` is the managed Herdr configuration. The dotfiles link script +places it at `~/.config/herdr/config.toml`; Herdr session state and logs remain +outside this directory. + +## Apply a configuration change + +Validate the managed configuration, then reload the running Herdr server: + +```bash +HERDR_CONFIG_PATH="$DOTFILES/herdr/config.toml" herdr config check +herdr server reload-config +``` + +The configuration key `keys.detach` uses `prefix+d`, matching tmux. This +reserves `prefix+q` for the future pane picker. diff --git a/herdr/config.toml b/herdr/config.toml index 86a7e3e..7ca9490 100644 --- a/herdr/config.toml +++ b/herdr/config.toml @@ -70,7 +70,8 @@ # Prefix-mode actions # help = "prefix+?" # settings = "prefix+s" -# detach = "prefix+q" +# Use tmux-compatible detach and reserve prefix+q for pane selection. +detach = "prefix+d" # reload_config = "prefix+shift+r" # open_notification_target = "prefix+o" # workspace_picker = "prefix+w"