feat: party log records a group-readable transcript

tmux pipe-pane on every pane of the party session, appending into
<party dir>/log (0640, party group) so any attendee can grab a copy.
Start and stop are announced to everyone attached; close rescues a
non-empty transcript to the host's home before removing the dir.
Panes opened later are picked up by re-running party log (a
pane_pipe check keeps already-piped panes single-piped, since tmux's
pipe-pane -o toggles an existing pipe closed rather than skipping it).
Raw output, escapes included. Close polls the transcript for size
stability before rescuing it, since a cross-filesystem mv is
copy+unlink and could otherwise drop bytes still draining from the
pipe-pane writers.
This commit is contained in:
veg 2026-07-11 12:48:29 +00:00
parent a011e4b03c
commit aea7ef58b6
5 changed files with 229 additions and 7 deletions

31
party.1
View file

@ -16,6 +16,10 @@
.Nm
.Cm clean
.Nm
.Cm log
.Op Fl -stop
.Op Fl -party Ar name
.Nm
.Cm join
.Op Ar name
.Op Fl -passive
@ -142,6 +146,23 @@ Host-only.
Remove the caller's own dead party directories: crash leftovers whose
tmux server no longer answers.
Never touches live parties, other users' directories, or symlinks.
.It Cm log Op Fl -stop Op Fl -party Ar name
Record the party into
.Pa log
inside the per-party directory (host only), via
.Xr tmux 1
.Ic pipe-pane .
The file is group-readable so any attendee can grab a copy.
Starting and stopping is announced to everyone attached.
Panes opened after logging starts are not captured until
.Cm log
is re-run; output is raw (ANSI escapes included, read with
.Ql less -R ) .
.Fl -stop
ends recording.
.Cm close
rescues a non-empty transcript to the host's home directory before
removing the party directory.
.It Cm join Op Ar name Op Fl -passive
Join a party.
With no
@ -314,6 +335,11 @@ every read, not trusted from the file.
Auto-generated helper that fans
.Cm display-message
out to every attached client on join/leave.
.It Pa ${PARTY_SOCKET_DIR}/party-${USER}:${NAME}.d/log
Transcript written by
.Cm log ;
removed with the party directory unless rescued by
.Cm close .
.El
.Sh EXIT STATUS
.Bl -tag -width Ds
@ -493,6 +519,11 @@ has no equivalent of
The watcher boundary is set at
.Cm join Fl -passive
time and is fixed for the life of that client.
.Pp
Every member of the party's group can read a
.Cm log
transcript, since the per-party directory is the perimeter, including
group members who were never invited.
.Sh SEE ALSO
.Xr tmux 1 ,
.Xr screen 1 ,