shellmates 0.1.5 → 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/lib/commands/install-hook.js +2 -1
- package/package.json +1 -1
- package/scripts/spawn-team.sh +51 -22
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk'
|
|
2
2
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync, chmodSync } from 'fs'
|
|
3
|
-
import { join, dirname
|
|
3
|
+
import { join, dirname } from 'path'
|
|
4
|
+
import { fileURLToPath } from 'url'
|
|
4
5
|
import { homedir } from 'os'
|
|
5
6
|
|
|
6
7
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
package/package.json
CHANGED
package/scripts/spawn-team.sh
CHANGED
|
@@ -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 [[ "$
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
tmux
|
|
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 "
|
|
311
|
+
echo "Agent spawned: $SESSION"
|
|
288
312
|
echo ""
|
|
289
313
|
|
|
290
|
-
|
|
291
|
-
|
|
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
|
-
|
|
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
|