summaryrefslogtreecommitdiff
path: root/dotfiles/common/.local/bin/aix
blob: 9f689eb91647e3093b9212f44013bb47c71cd30d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/bin/bash
# Launch tmux session with an LLM in fzf-selected project directories

SESSION="ai"

# 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

# Claude command — separated for safe editing
AI_CMD="claude"
AI_INSTRUCTIONS='Read docs/protocols.org and follow all instructions.'

# Build candidate directory list
build_candidates() {
  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
}

# If session exists, add new windows to it
if tmux has-session -t "$SESSION" 2>/dev/null; then
  # Get existing window names to filter duplicates
  existing=$(tmux list-windows -t "$SESSION" -F '#{window_name}')

  build_candidates

  # Filter out candidates that already have a window open
  filtered=()
  for c in "${candidates[@]}"; do
    name="$(basename "${c/#\~/$HOME}")"
    if ! echo "$existing" | grep -qxF "$name"; then
      filtered+=("$c")
    fi
  done

  if [ ${#filtered[@]} -eq 0 ]; then
    echo "All projects already have windows open."
  else
    selections=$(printf '%s\n' "${filtered[@]}" | fzf --multi --height=70% --reverse)

    if [ -n "$selections" ]; then
      selected=()
      while IFS= read -r line; do
        selected+=("$line")
      done <<<"$selections"

      first_wid=""
      for entry in "${selected[@]}"; do
        dir="${entry/#\~/$HOME}"
        name="$(basename "$dir")"
        wid=$(tmux new-window -t "$SESSION" -n "$name" -c "$dir" -P -F '#{window_id}')
        sleep 0.1
        tmux send-keys -t "$wid" "$AI_CMD \"$AI_INSTRUCTIONS\"" Enter
        [ -z "$first_wid" ] && first_wid="$wid"
      done

      tmux select-window -t "$first_wid"
    fi
  fi

  # Attach or switch to session
  if [ -n "$TMUX" ]; then
    tmux switch-client -t "$SESSION"
  else
    tmux attach-session -t "$SESSION"
  fi
  exit 0
fi

# New session: select projects and create session
build_candidates

selections=$(printf '%s\n' "${candidates[@]}" | fzf --multi --height=70% --reverse)
[ -z "$selections" ] && exit 0

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" -P -F '#{window_id}' > /dev/null
first_wid=$(tmux list-windows -t "$SESSION" -F '#{window_id}' | head -1)
tmux send-keys -t "$first_wid" "$AI_CMD \"$AI_INSTRUCTIONS\"" Enter

# Create remaining windows
for entry in "${selected[@]:1}"; do
  dir="${entry/#\~/$HOME}"
  name="$(basename "$dir")"
  wid=$(tmux new-window -t "$SESSION" -n "$name" -c "$dir" -P -F '#{window_id}')
  tmux send-keys -t "$wid" "$AI_CMD \"$AI_INSTRUCTIONS\"" Enter
done

# Select first window and attach or switch
tmux select-window -t "$first_wid"
if [ -n "$TMUX" ]; then
  tmux switch-client -t "$SESSION"
else
  tmux attach-session -t "$SESSION"
fi