shellmates 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shellmates",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Seamless tmux multi-agent orchestration for Claude, Gemini, and Codex",
5
5
  "keywords": [
6
6
  "tmux",
@@ -39,6 +39,15 @@ PING_BACK_PANE=""
39
39
  NO_PING=false
40
40
  ATTACH=false
41
41
 
42
+ # Detect if we're running inside an existing tmux session (e.g. a pond session).
43
+ # If so, open agents as windows in the current session instead of new detached sessions.
44
+ INSIDE_TMUX=false
45
+ PARENT_SESSION=""
46
+ if [[ -n "${TMUX:-}" ]]; then
47
+ INSIDE_TMUX=true
48
+ PARENT_SESSION=$(tmux display-message -p '#S' 2>/dev/null || echo "")
49
+ fi
50
+
42
51
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
43
52
  MANIFEST_DIR="${HOME}/.shellmates"
44
53
  MANIFEST_FILE="${MANIFEST_DIR}/sessions.json"
@@ -113,8 +122,8 @@ if [[ -z "$PING_BACK_PANE" && "$NO_PING" == "false" ]]; then
113
122
  fi
114
123
  fi
115
124
 
116
- # Check for existing session
117
- if tmux has-session -t "$SESSION" 2>/dev/null; then
125
+ # Check for existing session (only relevant when creating a new detached session)
126
+ if [[ "$INSIDE_TMUX" == "false" ]] && tmux has-session -t "$SESSION" 2>/dev/null; then
118
127
  echo "ERROR: Session '$SESSION' already exists."
119
128
  echo " Use a different name: --session my-task-name"
120
129
  echo " Or check existing: bash $SCRIPT_DIR/status.sh"
@@ -136,21 +145,36 @@ echo " Task: $PURPOSE"
136
145
  [[ "$NO_PING" == "false" ]] && echo " Ping: $PING_BACK_PANE"
137
146
  echo ""
138
147
 
139
- # ── Create session ──────────────────────────────────────────────────────────
140
-
141
- tmux new-session -d -s "$SESSION" -c "$PROJECT_DIR"
142
- tmux set-option -w -t "$SESSION:0" pane-border-status top 2>/dev/null || true
143
-
144
- # First worker pane (already created with new-session)
145
- PANE_1=$(tmux list-panes -t "$SESSION:0" -F '#{pane_id}' | sed -n '1p')
146
- tmux select-pane -t "$PANE_1" -T "worker-1 ($AGENT)"
148
+ # ── Create session (or window if already inside tmux) ────────────────────────
147
149
 
148
150
  PANE_2=""
149
- if [[ "$WORKERS" -eq 2 ]]; then
150
- tmux split-window -h -t "$SESSION:0" -c "$PROJECT_DIR"
151
- tmux select-layout -t "$SESSION:0" even-horizontal
152
- PANE_2=$(tmux list-panes -t "$SESSION:0" -F '#{pane_id}' | sed -n '2p')
153
- tmux select-pane -t "$PANE_2" -T "worker-2 ($AGENT)"
151
+ if [[ "$INSIDE_TMUX" == "true" ]]; then
152
+ # Inside a pond session open agent directly as a new window in this session.
153
+ # No attach tricks, no separate sessions. User presses Ctrl+B n to reach it.
154
+ WINDOW_NAME="$AGENT"
155
+ tmux new-window -t "$PARENT_SESSION" -n "$WINDOW_NAME" -c "$PROJECT_DIR"
156
+ PANE_1=$(tmux list-panes -t "$PARENT_SESSION:$WINDOW_NAME" -F '#{pane_id}' | sed -n '1p')
157
+ tmux select-pane -t "$PANE_1" -T "worker-1 ($AGENT)" 2>/dev/null || true
158
+ if [[ "$WORKERS" -eq 2 ]]; then
159
+ tmux split-window -h -t "$PARENT_SESSION:$WINDOW_NAME" -c "$PROJECT_DIR"
160
+ tmux select-layout -t "$PARENT_SESSION:$WINDOW_NAME" even-horizontal
161
+ PANE_2=$(tmux list-panes -t "$PARENT_SESSION:$WINDOW_NAME" -F '#{pane_id}' | sed -n '2p')
162
+ tmux select-pane -t "$PANE_2" -T "worker-2 ($AGENT)" 2>/dev/null || true
163
+ fi
164
+ # Return focus to the orchestrator window so Claude's output stays visible
165
+ tmux select-window -t "$PARENT_SESSION:0"
166
+ else
167
+ # Not inside tmux — create a normal detached session
168
+ tmux new-session -d -s "$SESSION" -c "$PROJECT_DIR"
169
+ tmux set-option -w -t "$SESSION:0" pane-border-status top 2>/dev/null || true
170
+ PANE_1=$(tmux list-panes -t "$SESSION:0" -F '#{pane_id}' | sed -n '1p')
171
+ tmux select-pane -t "$PANE_1" -T "worker-1 ($AGENT)"
172
+ if [[ "$WORKERS" -eq 2 ]]; then
173
+ tmux split-window -h -t "$SESSION:0" -c "$PROJECT_DIR"
174
+ tmux select-layout -t "$SESSION:0" even-horizontal
175
+ PANE_2=$(tmux list-panes -t "$SESSION:0" -F '#{pane_id}' | sed -n '2p')
176
+ tmux select-pane -t "$PANE_2" -T "worker-2 ($AGENT)"
177
+ fi
154
178
  fi
155
179
 
156
180
  # ── Start agents ─────────────────────────────────────────────────────────────
@@ -284,19 +308,24 @@ bash "$SCRIPT_DIR/dispatch.sh" $DISPATCH_ARGS
284
308
  # ── Summary ───────────────────────────────────────────────────────────────────
285
309
 
286
310
  echo ""
287
- echo "Team spawned: $SESSION ($WORKERS worker)"
311
+ echo "Agent spawned: $SESSION"
288
312
  echo ""
289
313
 
290
- # Open the session view automatically
291
- bash "$SCRIPT_DIR/view-session.sh" "$SESSION" "$PANE_1"
314
+ if [[ "$INSIDE_TMUX" == "true" ]]; then
315
+ echo " ┌─────────────────────────────────────────────┐"
316
+ echo " │ Agent is running in this session │"
317
+ echo " │ Ctrl+B n → switch to agent window │"
318
+ echo " │ Ctrl+B p → switch back to orchestrator │"
319
+ echo " │ Ctrl+B w → pick from window list │"
320
+ echo " └─────────────────────────────────────────────┘"
321
+ else
322
+ bash "$SCRIPT_DIR/view-session.sh" "$SESSION" "$PANE_1"
323
+ fi
292
324
 
293
325
  if [[ "$NO_PING" == "false" && -n "$PING_BACK_PANE" ]]; then
294
326
  echo "Agent will notify pane $PING_BACK_PANE when done."
295
327
  fi
296
328
 
297
- echo "Kill when done: bash $SCRIPT_DIR/teardown.sh"
298
-
299
- # Optionally attach (overrides view-session behaviour)
300
- if [[ "$ATTACH" == "true" ]]; then
329
+ if [[ "$ATTACH" == "true" && "$INSIDE_TMUX" == "false" ]]; then
301
330
  tmux attach-session -t "$SESSION"
302
331
  fi