#!/bin/bash # Launch tmux session with an LLM in fzf-selected project directories SESSION="ai" # If session exists, attach or switch to it if tmux has-session -t "$SESSION" 2>/dev/null; then if [ -n "$TMUX" ]; then tmux switch-client -t "$SESSION" else tmux attach-session -t "$SESSION" fi exit 0 fi # Dependency checks for cmd in fzf tmux claude; do if ! command -v "$cmd" &>/dev/null; then echo "Error: $cmd is not installed" >&2 exit 1 fi done # Build candidate directory list candidates=() [ -d "$HOME/.emacs.d" ] && candidates+=("~/.emacs.d") if [ -d "$HOME/code" ]; then while IFS= read -r d; do candidates+=("~/${d#"$HOME"/}") done < <(find "$HOME/code" -maxdepth 1 -mindepth 1 -type d | sort) fi if [ -d "$HOME/projects" ]; then while IFS= read -r d; do candidates+=("~/${d#"$HOME"/}") done < <(find "$HOME/projects" -maxdepth 1 -mindepth 1 -type d | sort) fi # Present fzf for multi-select selections=$(printf '%s\n' "${candidates[@]}" | fzf --multi --height=70% --reverse) [ -z "$selections" ] && exit 0 # Claude command — separated for safe editing AI_CMD="claude" AI_INSTRUCTIONS='Read docs/protocols.org and follow all instructions.' # Read selections into array selected=() while IFS= read -r line; do selected+=("$line") done <<<"$selections" # Create session with first selection first="${selected[0]}" dir="${first/#\~/$HOME}" name="$(basename "$dir")" tmux new-session -d -s "$SESSION" -n "$name" -c "$dir" tmux send-keys -t "$SESSION:$name" "$AI_CMD \"$AI_INSTRUCTIONS\"" Enter # Create remaining windows for entry in "${selected[@]:1}"; do dir="${entry/#\~/$HOME}" name="$(basename "$dir")" tmux new-window -t "$SESSION" -n "$name" -c "$dir" tmux send-keys -t "$SESSION:$name" "$AI_CMD \"$AI_INSTRUCTIONS\"" Enter done # Select first window and attach or switch first_name="$(basename "${selected[0]/#\~/$HOME}")" tmux select-window -t "$SESSION:$first_name" if [ -n "$TMUX" ]; then tmux switch-client -t "$SESSION" else tmux attach-session -t "$SESSION" fi