diff --git a/packages/mosaic/framework/tools/tmux/send-message.sh b/packages/mosaic/framework/tools/tmux/send-message.sh index 88ffe3ba..56144d54 100755 --- a/packages/mosaic/framework/tools/tmux/send-message.sh +++ b/packages/mosaic/framework/tools/tmux/send-message.sh @@ -122,9 +122,16 @@ locate_input_box() { glyph_line=$(printf '%s\n' "$pane" | grep -E '❯|^>|│ >' | tail -1) if [ -n "$glyph_line" ]; then printf '%s\n' "$glyph_line"; return 0; fi rule_lines=$(printf '%s\n' "$pane" | grep -nE '^[[:space:]]*─{4,}[[:space:]]*$' | cut -d: -f1 | tail -2) - [ "$(printf '%s\n' "$rule_lines" | grep -c .)" -eq 2 ] || return 1 - top=$(printf '%s\n' "$rule_lines" | head -1) - bottom=$(printf '%s\n' "$rule_lines" | tail -1) + [ -n "$rule_lines" ] || return 1 + # Split the (at most two) captured line numbers with parameter expansion. Not + # `head -1`: piping into an early-exiting consumer SIGPIPEs the producer, which + # under `set -euo pipefail` aborts the caller with rc=141 and no output. The + # scripts/pipefail-early-exit.test.mjs guard reds on that shape, correctly. + # With one rule captured both halves resolve to the same value and the + # ordering test below rejects it, which is the answer we want anyway. + top=${rule_lines%%$'\n'*} + bottom=${rule_lines##*$'\n'} + [ "$top" != "$bottom" ] || return 1 [ "$bottom" -gt "$top" ] || return 1 # An empty range (adjacent rules) prints nothing and still returns 0: found, # empty, which is the delivered shape.