From 9b7b5c02e055540efd5bebed408a52e09de43233 Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Thu, 12 Feb 2026 22:33:14 -0800 Subject: [PATCH] Add rofi launcher for tmux Codex and nixos agent notes --- dotfiles/lib/bin/rofi_tmcodex.sh | 88 ++++++++++++++++++++++++++++++++ dotfiles/lib/functions/tmcodex | 15 ++++++ nixos/AGENTS.md | 25 +++++++++ 3 files changed, 128 insertions(+) create mode 100755 dotfiles/lib/bin/rofi_tmcodex.sh create mode 100644 nixos/AGENTS.md diff --git a/dotfiles/lib/bin/rofi_tmcodex.sh b/dotfiles/lib/bin/rofi_tmcodex.sh new file mode 100755 index 00000000..7f0ea060 --- /dev/null +++ b/dotfiles/lib/bin/rofi_tmcodex.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Pick a directory via rofi, then start Codex in a tmux session rooted there. +# Remembers previously used directories in: +# ${XDG_STATE_HOME:-~/.local/state}/rofi-tmcodex/dirs + +state_dir="${XDG_STATE_HOME:-$HOME/.local/state}/rofi-tmcodex" +history_file="$state_dir/dirs" +mkdir -p "$state_dir" +touch "$history_file" + +emit_candidates() { + # 1) Previously-used dirs (most recent first). + cat "$history_file" 2>/dev/null || true + + # 2) A few common roots. + for d in \ + "$HOME/dotfiles" \ + "$HOME/dotfiles/nixos" \ + "$HOME/Projects" \ + "$HOME/config" \ + "$HOME/org" + do + [[ -d "$d" ]] && printf '%s\n' "$d" + done + + # 3) Shallow git repo discovery under a few likely roots. + if command -v fd >/dev/null 2>&1; then + local root gitdir + for root in "$HOME/Projects" "$HOME/dotfiles" "$HOME/config" "$HOME/org"; do + [[ -d "$root" ]] || continue + # Find ".git" directories; print their parent (repo root). + # Keep it shallow for speed. + while IFS= read -r gitdir; do + printf '%s\n' "${gitdir%/.git}" + done < <(fd -H -a -t d -d 4 '^\\.git$' "$root" 2>/dev/null || true) + done + fi +} + +dedup() { + awk 'NF && !seen[$0]++' +} + +selected_dir="$( + emit_candidates | dedup | rofi -dmenu -i -p 'tmcodex dir' +)" + +[[ -n "${selected_dir}" ]] || exit 0 + +# Expand ~ manually (rofi doesn't). +case "$selected_dir" in + "~"|"~/"*) + selected_dir="$HOME${selected_dir:1}" + ;; +esac + +if command -v realpath >/dev/null 2>&1; then + selected_dir="$(realpath -m -- "$selected_dir" 2>/dev/null || printf '%s' "$selected_dir")" +fi + +if [[ ! -d "$selected_dir" ]]; then + # Fail quietly; rofi launchers generally shouldn't spam terminals. + exit 1 +fi + +# Update history (most recent first, unique, cap size). +tmp="$(mktemp)" +{ + printf '%s\n' "$selected_dir" + cat "$history_file" +} | dedup | head -n 200 >"$tmp" +mv -f "$tmp" "$history_file" + +# rofi launches typically have no controlling terminal. Start the agent detached +# inside tmux (tmux allocates a pty for the window). You can attach later. +base="$(basename -- "$selected_dir")" +ck="$(printf '%s' "$selected_dir" | cksum | awk '{print $1}')" +session="codex-${base}-${ck}" +# tmux is picky; keep session name simple. +session="$(printf '%s' "$session" | tr -cs 'A-Za-z0-9_-' '-' | sed 's/^-//;s/-$//')" + +if tmux has-session -t "$session" 2>/dev/null; then + exec tmux new-window -t "$session" -c "$selected_dir" codex --dangerously-bypass-approvals-and-sandbox +else + exec tmux new-session -d -s "$session" -c "$selected_dir" codex --dangerously-bypass-approvals-and-sandbox +fi diff --git a/dotfiles/lib/functions/tmcodex b/dotfiles/lib/functions/tmcodex index b8e6686e..a047ac96 100644 --- a/dotfiles/lib/functions/tmcodex +++ b/dotfiles/lib/functions/tmcodex @@ -1,6 +1,21 @@ #!/usr/bin/env sh function tmcodex { + # Record launch directories so rofi_tmcodex can offer good defaults. + state_dir="${XDG_STATE_HOME:-$HOME/.local/state}/rofi-tmcodex" + history_file="$state_dir/dirs" + mkdir -p "$state_dir" 2>/dev/null || true + if [ -d "$PWD" ]; then + tmp="$(mktemp 2>/dev/null || true)" + if [ -n "$tmp" ]; then + { printf '%s\n' "$PWD"; cat "$history_file" 2>/dev/null || true; } \ + | awk 'NF && !seen[$0]++' \ + | head -n 200 >"$tmp" 2>/dev/null || true + mv -f "$tmp" "$history_file" 2>/dev/null || true + else + printf '%s\n' "$PWD" >>"$history_file" 2>/dev/null || true + fi + fi trw codex --dangerously-bypass-approvals-and-sandbox "$@" } diff --git a/nixos/AGENTS.md b/nixos/AGENTS.md new file mode 100644 index 00000000..e22be161 --- /dev/null +++ b/nixos/AGENTS.md @@ -0,0 +1,25 @@ +# Agent Notes (dotfiles/nixos) + +This repository is a single git repo rooted at `~/dotfiles`. This `nixos/` directory is the NixOS flake, but most "user command" scripts and shell functions live outside of it. + +## Where To Put Things + +- Shell functions (autoloaded by zsh): `../dotfiles/lib/functions/` + - These are added to `fpath` in `nixos/environment.nix`, then autoloaded. +- User-executable scripts on PATH: `../dotfiles/lib/bin/` + - This directory is added to PATH in `nixos/environment.nix` via `${libDir}/bin`. + +Avoid dropping scripts in `~/bin` or `~/.local/bin` unless the user explicitly asks. + +## NixOS Rebuild Workflow + +- Run `just switch` from `~/dotfiles/nixos` (not `nixos-rebuild` directly). +- Host configs live under `machines/`. + +## Rofi/Tmux Integration Pointers + +- Existing rofi scripts live in `../dotfiles/lib/bin/` (e.g. `rofi_command.sh`). +- Keybind locations: + - Hyprland: `../dotfiles/config/hypr/hyprland.conf` + - XMonad: `../dotfiles/config/xmonad/xmonad.hs` +