Skip to content

Releases: rnabioco/sinteractive

v1.1.0

Choose a tag to compare

@jayhesselberth jayhesselberth released this 29 Aug 20:06
d354674

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

Choose a tag to compare

@jayhesselberth jayhesselberth released this 29 Aug 20:06
9857d33

What's Changed

Full Changelog: v0.7.0...v1.0.0

v0.7.0

Choose a tag to compare

@jayhesselberth jayhesselberth released this 27 Aug 21:44
e35cd19

What's Changed

Full Changelog: v0.6.0...v0.7.0

v0.6.0

Choose a tag to compare

@jayhesselberth jayhesselberth released this 27 Aug 01:19

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.0

Full changelog: v0.5.1...v0.6.0

v0.5.1

Choose a tag to compare

@jayhesselberth jayhesselberth released this 26 Aug 23:28
b751a56

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) and SHORT 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-quota after 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

Choose a tag to compare

@jayhesselberth jayhesselberth released this 26 Aug 20:24
6b98246

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-readable

Cached 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             # confirm

The 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

Choose a tag to compare

@jayhesselberth jayhesselberth released this 26 Aug 14:42
1c18c7d

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-claude

The 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

Choose a tag to compare

@jayhesselberth jayhesselberth released this 26 Aug 11:09

Changed

  • --install-claude now registers the hooks for you instead of printing a
    settings.json block and leaving the merge to you. The merge is done with
    jq and only with jq — rewriting the user's settings with string surgery
    in bash could silently disable every setting in the file. It is additive
    (appended to whatever .hooks already holds, other keys and their order
    untouched), idempotent (a hook already registered in settings.json or
    settings.local.json is skipped, matched by script name so a hand-edited
    path or a dropped bash prefix 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 as settings.json.bak-STAMP, a
    symlinked settings.json is 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 jq on $PATH the block is printed to merge by hand exactly as
    before, with a note that installing one (pixi global install jq) lets
    sinteractive do it. jq stays an optional dependency.

Fixed

  • make nodes now installs the same set of files as make 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-claude resolves 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/bin copy, 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 nodes renames the script into place instead of writing over it, for
    the reason tmux-push does: --attach SSHes into a node and runs the
    script there, so a copy can be executing while you install.
  • make nodes asks pdsh for the ssh rcmd module by name (-R ssh, override
    with PDSH_RCMD). pdsh defaults to rsh, so on a cluster with nothing on
    port 514 the target failed with connect: Connection refused for every
    node — and exporting PDSH_RCMD_TYPE=ssh did not help under sudo make,
    which resets the environment.

Added

  • make nodes-check reports the sinteractive version, whether the Claude
    Code assets are present, and the tmux version on every node in NODES.
    Read-only and unprivileged. Drift is otherwise invisible — sbatch spools
    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
    --attach and --install-claude.

Full Changelog: v0.2.2...v0.3.0

v0.2.2

Choose a tag to compare

@jayhesselberth jayhesselberth released this 26 Aug 11:09

Changed

  • Slurm jobs are now asked to carry a name in both fields: -J NAME and
    --comment=NAME, the same short descriptive value. The bodhi-compute
    skill, the --agent-context briefing, the man page and the docs all show
    it on every srun/salloc example, so a shared partition stops filling
    with jobs called bash. 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, so sacct history
    keeps the name alone. Name and comment belong to the allocation, so naming
    an salloc covers every srun --overlap step run inside it.

Full Changelog: v0.2.1...v0.2.2

v0.2.1

Choose a tag to compare

@jayhesselberth jayhesselberth released this 25 Aug 15:10

Fixed

  • pixi.toml now 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