Releases: rnabioco/sinteractive
Release list
v1.1.0
What's Changed
- fix(ui): the bar was drawing the light palette on a dark terminal by @jayhesselberth in #21
- refactor(cli): group the command tree by who runs each verb by @jayhesselberth in #20
- fix(ui): Ctrl+b m could not get back into the monitor panel by @jayhesselberth in #23
- fix(session): keep our state dir when the session redirects XDG_CACHE_HOME by @jayhesselberth in #25
- fix(ui): a session-relative bar, a shorter statusline and a bluer hint by @jayhesselberth in #26
- fix(ui): inset the bar line one column from the left edge by @jayhesselberth in #27
- fix(ui): a queue popup you can quit, a paged help legend, a lighter rule by @jayhesselberth in #28
- fix(claude): register hooks, statusline and MCP server by absolute path by @jayhesselberth in #29
- build: install the binary beside a symlink so reinstalling keeps sessions alive by @jayhesselberth in #30
- fix(mcp): start wait_for_event at the beginning of a half-written line by @jayhesselberth in #31
- fix(ui): line the monitor panel's rows up on one grid by @jayhesselberth in #32
- fix(ui): every popup says how to leave it, on its first rows by @jayhesselberth in #33
- fix(job): let a job's own environment say which session launched it by @jayhesselberth in #34
- feat(claude): put every repository's worktrees on scratch through a hook by @jayhesselberth in #35
- fix(claude): register the binary by its symlink, not the build behind it by @jayhesselberth in #36
- chore(completions): regenerate for the worktree hook verbs by @jayhesselberth in #37
- chore(release): v1.1.0 by @jayhesselberth in #38
Full Changelog: v1.0.0...v1.1.0
v1.0.0
What's Changed
- sinteractive 1.0: Rust rewrite on zellij, agents first by @jayhesselberth in #18
Full Changelog: v0.7.0...v1.0.0
v0.7.0
What's Changed
- feat(skills): cover Alpine, rename bodhi-* to hpc-*, split per cluster by @jayhesselberth in #15
- feat: collapse status notices into a session-line indicator and Ctrl+b n popup by @jayhesselberth in #16
- chore(release): v0.7.0 by @jayhesselberth in #17
Full Changelog: v0.6.0...v0.7.0
v0.6.0
Changed
The reporting commands are in colour. --help, --list, --status, --check-quota and --install-claude printed flat text while the launch and teardown narration beside them was already colourised. Job ids and node names are teal wherever they appear, matching the narration and the status bar; labels are yellow, secondary text dim.
Colour is decided per stream rather than once at startup. The narration writes to stderr and asks about stderr; the reporting commands write to stdout and ask about stdout, so sinteractive --list | less carries no escapes and a plain sinteractive --list does. SINTERACTIVE_COLOR, NO_COLOR and TERM=dumb work as before, on both.
Two things now read by colour rather than by parsing: --status shades the remaining walltime yellow under an hour and red under fifteen minutes, and every table that lists jobs marks a PENDING one yellow against a green RUNNING — in the job-limit error that is the point, since a pending job holds a slot exactly as a running one does.
Errors are uniform throughout: a red bold label, the message beside it, and any follow-on hint dimmed under it. Text sinteractive quotes rather than writes — sbatch's own stderr — is left exactly as sbatch produced it.
The warnings line under the status bar is split, quota flush left and the maintenance-trimmed end time flush right, matching the two ends the session line above it already uses. They used to sit side by side at the left with a separator between them, reading as one long run of text with the middle of the line empty.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
● session 246026 | compute15 | sint Help: Ctrl+b h | Detach: Ctrl+b d
⚠ QUOTA over by 204.8G (30T limit) ends Thu 06:00 · monthly-maint
Claude Code: run sinteractive --install-claude to enable the skills and hooks
Each half keeps its side whether or not the other is there, so neither moves when its neighbour appears or clears.
Both are shorter. The quota notice reports the overage instead of the usage because that is the number you act on, and "over by" already says you are over. The maintenance notice drops its SHORT SESSION label: in yellow, on the warnings line, an end time that is not the one you asked for is already reading as a warning, so the space goes to the reservation name instead.
Upgrading
Running sessions are unaffected — sbatch spools its own copy of the script, so a session keeps running the version that launched it. Install on the login node and fan out to the compute nodes as usual:
make install # or: sudo make install-system
make nodes-check # confirm every node reports 0.6.0Full changelog: v0.5.1...v0.6.0
v0.5.1
Everything a session has to say about itself moves off the pane border and onto status lines of its own, below the session line.
Notice lines
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
● session 245772 | compute07 Help: Ctrl+b h | Detach: Ctrl+b d
⚠ OVER QUOTA 30.2T / 30T · over by 204.8G │ SHORT SESSION · ends before monthly-maint at Thu 06:00
Claude Code: run sinteractive --install-claude to enable the skills and hooks
The border was carrying three unrelated things at once — two warnings and a scrolling offer to install the Claude Code hooks — sharing one rule and taking turns for it, directly above the one line you glance at for the job id.
- Warnings nearest the session line.
OVER QUOTA(red) andSHORT SESSION(yellow) both hold for the life of the session, so they share a line rather than taking turns. - The Claude Code hint furthest away, since it is an offer rather than something to act on.
- Each line exists only while it has something on it. A session with nothing to say is exactly as tall as before, and the pane gets its row back the moment a warning clears — which is what makes
sinteractive --check-quotaafter a deletion feel like it did something. - The hint no longer scrolls. A full-width line fits the whole sentence at 80 columns, which retires the 0.3s redraw the marquee forced on every session that showed it.
- The pane border is a plain rule again, with no text.
One tmux subtlety
Setting one element of an option array at session scope replaces the whole array for that session instead of overlaying the global one. A session-scoped status-format[1] therefore leaves status-format[0] empty, and the session line — the thing the notices are meant to sit under — silently disappears. The extra indices are set globally instead; every job has its own tmux server, so that is still one session's worth of scope.
Full changelog: v0.5.0...v0.5.1
v0.5.0
A session now tells you two things about itself it previously did not: that
your writes are about to start failing, and that the allocation you got is not
the one you asked for. Plus colour in the launch and teardown narration.
The notice line
The rule above the status bar carries warnings, ranked — something you must
act on outranks something you should know:
━━━━━━━━━━━━━ ⚠ OVER QUOTA 30.2T / 30T · over by 204.8G ━━━━━━━━━━━━━
━ ⚠ OVER QUOTA 30.2T / 30T · over by 204.8G │ SHORT SESSION · ends before monthly-maint at Thu 06:00 ━
The warnings are static — a marquee is right for an invitation and wrong for a
warning — and share the line when both apply. The scrolling Claude Code hint
keeps the line only when nothing more important wants it.
Storage quota, without the head node
quota_check lives only on the head node, so the obvious design is
ssh head quota_check on a timer. It turns out not to be needed: the hard
limit is a shared file, and the quota daemons answer the compute nodes
directly. The probe is bash and /dev/tcp, takes about a second, and
reproduces quota_check -b exactly.
sinteractive --check-quota # re-check now, update every open session
sinteractive --check-quota --json # same, machine-readableCached per user rather than per session, so six open sessions still cost one
probe per interval. --check-quota clears the warning within a tick of space
actually being freed — which is the point for an agent that has just deleted
something on your behalf. The bodhi-storage skill and --agent-context both
now say so.
Every input is overridable (SINTERACTIVE_QUOTA_FILE, _HOSTS, _PORT,
_TIMEOUT, _POLL) and every failure is silent, so a cluster that does its
quotas differently never shows the notice.
Maintenance windows: trim, don't refuse
Slurm defers a job that would run into a reservation until the window closes,
so at the default day-long request a session simply stopped starting as
maintenance approached. It is now shortened to fit and says so:
$ sinteractive -n analysis
! Maintenance (monthly-maint) starts Thu Aug 27 06:00.
Shortened the request from 24:00:00 to 17:10:43 so the session ends before it.The session then carries a SHORT SESSION notice for its whole life, so the
shortened allocation stays visible after the launch output has scrolled away.
A launch is still refused when under 10 minutes remain, and an explicit
--reservation is left alone.
Colour
Four roles, not a rainbow: teal for identifiers (job ids, node names) matching
the status bar's own colour for them, dim for progress, yellow for keys and
warnings, red for errors, green for the session coming up and a cancel
landing.
SINTERACTIVE_COLOR takes auto/always/never, and NO_COLOR is honoured.
The auto test is on stderr, not stdout, because that is where the
narration goes — so --detach ... > file still narrates to your terminal
while 2>log stays free of escapes.
Upgrading
sudo make install-system # login node
sudo make nodes # fan out to the compute nodes
make nodes-check # confirmThe compute nodes need this: a session runs the node's copy of the script, so
the notice line and quota probe only appear once the nodes are updated.
Full changelog: https://github.com/rnabioco/sinteractive/blob/v0.5.0/CHANGELOG.md
v0.4.0
Six Claude Code skills where 0.3.0 shipped one, and an installer that
discovers them instead of naming them.
Skills
| Skill | Teaches |
|---|---|
bodhi-compute |
Cluster etiquette — a session is not a compute target. Now also sizing walltime around the monthly maintenance window. |
slurm-discovery |
What the cluster offers: partitions, accounts, QOS, and which combinations submit. Caches the map per cluster. |
bodhi-storage |
/beevol vs node-local /tmp, and where output belongs. |
bodhi-software |
Modules first, then containers, then pixi/uv. |
slurm-batch |
sbatch, arrays, dependencies, right-sizing from sacct. |
git-workflow |
Semantic versioning, Conventional Commits, worktrees, pull requests. |
Skills load on demand from their descriptions, so an agent picks up the one
the task calls for rather than carrying all six.
Installer
--install-claude now copies every skills/*/SKILL.md found beside the
script, and make install, make install-system and make nodes install the
whole tree from a $(SKILLS) wildcard. Adding a skill is dropping a directory
into skills/ — the previous shape hardcoded skills/bodhi-compute in six
places, and any one of them missed would have shipped a partial set to the
compute nodes.
make nodes-check now reports assets present based on the skills/ directory
rather than one skill inside it.
Notable
The maintenance-window guidance came out of measuring the scheduler rather
than reading the docs: a job asking for more walltime than remains before the
window is not rejected, it is deferred to after it. Against a window
21h49m out, -t 21:00:00 started immediately and -t 22:00:00 was pushed
46 hours to the reservation's end. ReqNodeNotAvail, Reserved for maintenance
in squeue is that, and it does not want resubmitting.
Upgrading
sudo make install-system # login node
sudo make nodes # fan out to the compute nodes
make nodes-check # confirm
sinteractive --install-claudeThe compute nodes need the assets too: running --install-claude from inside
a session runs the node's copy of the script, which resolves them relative to
itself.
Full changelog: https://github.com/rnabioco/sinteractive/blob/v0.4.0/CHANGELOG.md
v0.3.0
Changed
-
--install-claudenow registers the hooks for you instead of printing a
settings.jsonblock and leaving the merge to you. The merge is done with
jqand only withjq— rewriting the user's settings with string surgery
in bash could silently disable every setting in the file. It is additive
(appended to whatever.hooksalready holds, other keys and their order
untouched), idempotent (a hook already registered insettings.jsonor
settings.local.jsonis skipped, matched by script name so a hand-edited
path or a droppedbashprefix still counts, and a half-registered pair
gets only its missing half), and it writes nothing when the result would be
unchanged. The file it replaces is kept assettings.json.bak-STAMP, a
symlinkedsettings.jsonis resolved first so a dotfiles repo gets its
target edited rather than its link replaced, and one that does not parse is
reported and left alone.Without
jqon$PATHthe block is printed to merge by hand exactly as
before, with a note that installing one (pixi global install jq) lets
sinteractive do it.jqstays an optional dependency.
Fixed
make nodesnow installs the same set of files asmake install-system,
the Claude Code assets included; it had shipped only the script, man page
and completion. The assets belong on the compute nodes because
--install-clauderesolves them relative to the running script: someone
following the status-bar hint runs it from inside a session, which runs the
node's/usr/local/bincopy, and with no<prefix>/share/sinteractive
beside it that call failed. It worked only for people who had also
installed into a shared$HOME.make nodesrenames the script into place instead of writing over it, for
the reasontmux-pushdoes:--attachSSHes into a node and runs the
script there, so a copy can be executing while you install.make nodesasks pdsh for the ssh rcmd module by name (-R ssh, override
withPDSH_RCMD). pdsh defaults torsh, so on a cluster with nothing on
port 514 the target failed withconnect: Connection refusedfor every
node — and exportingPDSH_RCMD_TYPE=sshdid not help undersudo make,
which resets the environment.
Added
make nodes-checkreports the sinteractive version, whether the Claude
Code assets are present, and the tmux version on every node inNODES.
Read-only and unprivileged. Drift is otherwise invisible —sbatchspools
the submitted copy of the script, so sessions keep working from whatever
the submitting node has, and a stale compute node only shows up in
--attachand--install-claude.
Full Changelog: v0.2.2...v0.3.0
v0.2.2
Changed
- Slurm jobs are now asked to carry a name in both fields:
-J NAMEand
--comment=NAME, the same short descriptive value. Thebodhi-compute
skill, the--agent-contextbriefing, the man page and the docs all show
it on everysrun/sallocexample, so a shared partition stops filling
with jobs calledbash. Both fields earn their place because they survive
differently: the comment is readable on a live job (squeue,scontrol show job ID) but only reaches accounting on clusters that set
AccountingStoreFlags=job_comment— Bodhi does not, sosaccthistory
keeps the name alone. Name and comment belong to the allocation, so naming
ansalloccovers everysrun --overlapstep run inside it.
Full Changelog: v0.2.1...v0.2.2
v0.2.1
Fixed
pixi.tomlnow carries the release version. The docs-site workspace
had been left at 0.1.0 since the first tag, four releases behind; it
is bumped alongside the script and the man page from now on, and a
comment beside it says so.
Full Changelog: v0.2.0...v0.2.1