@@ -140,8 +140,8 @@ if [ -z \"$SESSION\" ] || [ -z \"$PANE\" ]; then\n\
140140 echo \" tmux target not found; omit target/session/pane to use the default shared pane, or create one with tmux_create_pane\" >&2\n \
141141 exit 1\n \
142142 fi\n \
143- SESSION_MANAGED=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
144- SESSION_OWNER=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
143+ SESSION_MANAGED=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
144+ SESSION_OWNER=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
145145 if [ \" $SESSION_MANAGED\" != \" 1\" ] || [ \" $SESSION_OWNER\" != \" $OWNER\" ]; then\n \
146146 echo \" tmux session '$SESSION' is not managed by this buddy instance\" >&2\n \
147147 exit 1\n \
@@ -177,9 +177,9 @@ PANE_TITLE='{TMUX_PANE_TITLE}'\n\
177177 MAX_SESSIONS={max_sessions}\n \
178178 COUNT=\" $(tmux list-sessions -F '#{{session_name}}\\ t#{{@buddy_managed}}\\ t#{{@buddy_owner}}' 2>/dev/null | awk -F '\\ t' -v owner=\" $OWNER\" '$2==\" 1\" && $3==owner {{c++}} END {{print c+0}}')\" \n \
179179 CREATED=0\n \
180- if tmux has-session -t \" $SESSION\" 2>/dev/null; then\n \
181- SESSION_MANAGED=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
182- SESSION_OWNER=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
180+ if tmux has-session -t \" = $SESSION\" 2>/dev/null; then\n \
181+ SESSION_MANAGED=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
182+ SESSION_OWNER=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
183183 if [ \" $SESSION_MANAGED\" != \" 1\" ] || [ \" $SESSION_OWNER\" != \" $OWNER\" ]; then\n \
184184 echo \" tmux session '$SESSION' exists but is not managed by this buddy instance\" >&2\n \
185185 exit 1\n \
@@ -192,16 +192,16 @@ else\n\
192192 tmux new-session -d -s \" $SESSION\" -n \" $WINDOW\" \n \
193193 CREATED=1\n \
194194 fi\n \
195- if ! tmux list-windows -t \" $SESSION\" -F '#{{window_name}}' | grep -Fx -- \" $WINDOW\" >/dev/null 2>&1; then\n \
196- tmux new-window -d -t \" $SESSION\" -n \" $WINDOW\" \n \
195+ if ! tmux list-windows -t \" = $SESSION\" -F '#{{window_name}}' | grep -Fx -- \" $WINDOW\" >/dev/null 2>&1; then\n \
196+ tmux new-window -d -t \" = $SESSION\" -n \" $WINDOW\" \n \
197197 fi\n \
198198 PANE=\" $(tmux list-panes -a -F '#{{session_name}}\\ t#{{pane_id}}\\ t#{{pane_title}}' | awk -F '\\ t' -v session=\" $SESSION\" -v pane_title=\" $PANE_TITLE\" '$1==session && $3==pane_title {{print $2; exit}}')\" \n \
199199 if [ -z \" $PANE\" ]; then\n \
200- PANE=\" $(tmux list-panes -t \" $SESSION:$WINDOW\" -F '#{{pane_id}}' | head -n1)\" \n \
200+ PANE=\" $(tmux list-panes -t \" = $SESSION:$WINDOW\" -F '#{{pane_id}}' | head -n1)\" \n \
201201 tmux select-pane -t \" $PANE\" -T \" $PANE_TITLE\" >/dev/null 2>&1 || true\n \
202202 fi\n \
203- tmux set-option -q -t \" $SESSION\" {TMUX_MANAGED_OPTION} 1\n \
204- tmux set-option -q -t \" $SESSION\" {TMUX_OWNER_OPTION} \" $OWNER\" \n \
203+ tmux set-option -q -t \" = $SESSION\" {TMUX_MANAGED_OPTION} 1\n \
204+ tmux set-option -q -t \" = $SESSION\" {TMUX_OWNER_OPTION} \" $OWNER\" \n \
205205 tmux set-option -q -p -t \" $PANE\" {TMUX_MANAGED_OPTION} 1\n \
206206 tmux set-option -q -p -t \" $PANE\" {TMUX_OWNER_OPTION} \" $OWNER\" \n \
207207 printf '%s\\ n%s\\ n%s' \" $SESSION\" \" $PANE\" \" $CREATED\" \n "
@@ -228,12 +228,12 @@ SESSION={session_q}\n\
228228 PANE_TITLE={pane_q}\n \
229229 WINDOW='{TMUX_WINDOW_NAME}'\n \
230230 MAX_PANES={max_panes}\n \
231- if ! tmux has-session -t \" $SESSION\" 2>/dev/null; then\n \
231+ if ! tmux has-session -t \" = $SESSION\" 2>/dev/null; then\n \
232232 echo \" tmux session '$SESSION' was not found\" >&2\n \
233233 exit 1\n \
234234 fi\n \
235- SESSION_MANAGED=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
236- SESSION_OWNER=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
235+ SESSION_MANAGED=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
236+ SESSION_OWNER=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
237237 if [ \" $SESSION_MANAGED\" != \" 1\" ] || [ \" $SESSION_OWNER\" != \" $OWNER\" ]; then\n \
238238 echo \" tmux session '$SESSION' is not managed by this buddy instance\" >&2\n \
239239 exit 1\n \
@@ -246,10 +246,10 @@ if [ -z \"$PANE\" ]; then\n\
246246 echo \" managed tmux pane limit reached in session '$SESSION' ($COUNT/$MAX_PANES)\" >&2\n \
247247 exit 1\n \
248248 fi\n \
249- if ! tmux list-windows -t \" $SESSION\" -F '#{{window_name}}' | grep -Fx -- \" $WINDOW\" >/dev/null 2>&1; then\n \
250- tmux new-window -d -t \" $SESSION\" -n \" $WINDOW\" \n \
249+ if ! tmux list-windows -t \" = $SESSION\" -F '#{{window_name}}' | grep -Fx -- \" $WINDOW\" >/dev/null 2>&1; then\n \
250+ tmux new-window -d -t \" = $SESSION\" -n \" $WINDOW\" \n \
251251 fi\n \
252- PANE=\" $(tmux split-window -d -P -F '#{{pane_id}}' -t \" $SESSION:$WINDOW\" )\" \n \
252+ PANE=\" $(tmux split-window -d -P -F '#{{pane_id}}' -t \" = $SESSION:$WINDOW\" )\" \n \
253253 tmux select-pane -t \" $PANE\" -T \" $PANE_TITLE\" >/dev/null 2>&1 || true\n \
254254 tmux set-option -q -p -t \" $PANE\" {TMUX_MANAGED_OPTION} 1\n \
255255 tmux set-option -q -p -t \" $PANE\" {TMUX_OWNER_OPTION} \" $OWNER\" \n \
@@ -278,12 +278,12 @@ OWNER={owner_q}\n\
278278 SESSION={session_q}\n \
279279 PANE_TITLE={pane_q}\n \
280280 DEFAULT_SESSION={default_session_q}\n \
281- if ! tmux has-session -t \" $SESSION\" 2>/dev/null; then\n \
281+ if ! tmux has-session -t \" = $SESSION\" 2>/dev/null; then\n \
282282 echo \" tmux session '$SESSION' was not found\" >&2\n \
283283 exit 1\n \
284284 fi\n \
285- SESSION_MANAGED=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
286- SESSION_OWNER=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
285+ SESSION_MANAGED=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
286+ SESSION_OWNER=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
287287 if [ \" $SESSION_MANAGED\" != \" 1\" ] || [ \" $SESSION_OWNER\" != \" $OWNER\" ]; then\n \
288288 echo \" tmux session '$SESSION' is not managed by this buddy instance\" >&2\n \
289289 exit 1\n \
@@ -327,17 +327,17 @@ if [ \"$SESSION\" = \"$DEFAULT_SESSION\" ]; then\n\
327327 echo \" cannot kill default managed tmux session\" >&2\n \
328328 exit 1\n \
329329 fi\n \
330- if ! tmux has-session -t \" $SESSION\" 2>/dev/null; then\n \
330+ if ! tmux has-session -t \" = $SESSION\" 2>/dev/null; then\n \
331331 echo \" tmux session '$SESSION' was not found\" >&2\n \
332332 exit 1\n \
333333 fi\n \
334- SESSION_MANAGED=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
335- SESSION_OWNER=\" $(tmux show-options -v -t \" $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
334+ SESSION_MANAGED=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_MANAGED_OPTION} 2>/dev/null || true)\" \n \
335+ SESSION_OWNER=\" $(tmux show-options -v -t \" = $SESSION\" {TMUX_OWNER_OPTION} 2>/dev/null || true)\" \n \
336336 if [ \" $SESSION_MANAGED\" != \" 1\" ] || [ \" $SESSION_OWNER\" != \" $OWNER\" ]; then\n \
337337 echo \" tmux session '$SESSION' is not managed by this buddy instance\" >&2\n \
338338 exit 1\n \
339339 fi\n \
340- tmux kill-session -t \" $SESSION\" \n \
340+ tmux kill-session -t \" = $SESSION\" \n \
341341 printf '%s' \" $SESSION\" \n "
342342 ) )
343343}
@@ -467,4 +467,24 @@ mod tests {
467467 resolve_managed_target_script ( "buddy-agent-mo" , "buddy-agent-mo" , & selector) . unwrap ( ) ;
468468 assert ! ( script. contains( "TARGET=''" ) ) ;
469469 }
470+
471+ #[ test]
472+ fn lifecycle_scripts_use_exact_session_targets ( ) {
473+ // Exact `=$SESSION` targeting avoids accidental prefix matching
474+ // (for example, resolving `buddy-agent-mo` to `buddy-agent-mo-default-repair`).
475+ let create = create_managed_session_script ( "buddy-agent-mo" , "buddy-agent-mo" , 1 ) ;
476+ assert ! ( create. contains( "tmux has-session -t \" =$SESSION\" " ) ) ;
477+ assert ! ( create. contains( "tmux list-windows -t \" =$SESSION\" " ) ) ;
478+ assert ! ( create. contains( "tmux set-option -q -t \" =$SESSION\" " ) ) ;
479+
480+ let pane =
481+ create_managed_pane_script ( "buddy-agent-mo" , "buddy-agent-mo" , None , "worker" , 5 )
482+ . unwrap ( ) ;
483+ assert ! ( pane. contains( "tmux has-session -t \" =$SESSION\" " ) ) ;
484+ assert ! ( pane. contains( "-t \" =$SESSION:$WINDOW\" " ) ) ;
485+
486+ let kill_session =
487+ kill_managed_session_script ( "buddy-agent-mo" , "buddy-agent-mo" , "worker" ) . unwrap ( ) ;
488+ assert ! ( kill_session. contains( "tmux kill-session -t \" =$SESSION\" " ) ) ;
489+ }
470490}
0 commit comments