Skip to content

Releases: seilk/opensmi

v0.4.0

02 Mar 19:53

Choose a tag to compare

Major architectural refactor: split the 5,922-line tui/index.ts God file into focused, single-responsibility modules.

Changes

  • Phase 0: De-duplicated poll/dispatch/watchdog functions, fixed lifecycle leak
  • Phase 1: Eliminated sync-bridge anti-pattern, wired components directly to S store
  • Phase 2: Wired index.ts to canonical api.ts + Jobs.ts implementations
  • Phase 3a: Deleted all duplicate definitions, wired to canonical src/ modules
  • Phase 3b: Extracted keypress handler + lifecycle intervals
  • Phase 4: Split Dashboard.ts → SSHView + SlurmView, Jobs.ts → JobListView + JobDetailView

Result

  • tui/index.ts: 5,922 → 430 lines (93% reduction)
  • Clean module architecture: views → services → state
  • All functions in single canonical locations
  • Barrel re-exports maintain import compatibility

Full Changelog: v0.3.6...v0.4.0

v0.3.6

02 Mar 12:27

Choose a tag to compare

What's Changed

TUI UI/UX Improvements

  • Cluster tabs moved to a separate second row below the main tab bar
  • [ / ] keyboard shortcuts to navigate app-level tabs (Dashboard / Help / Jobs / etc.)
  • [s] key cycles Slurm column sorting: none → name → state → gpu_used → gpu_free
  • Slurm node double-click opens srun popup (same as Enter)
  • Column header clicks for sort (with correct ▲/▼ direction indicator)

Bug Fixes

  • Fixed tab switch not showing the correct content screen
  • Fixed Command Runner click-to-focus (restored onMouseUp focus behavior)
  • Fixed Slurm mouse scroll (visibleRows/maxSc consistency)
  • Fixed sort column click not resetting selected row index

Cleanup & Refactoring

  • Removed GPU Assignment panel from Command Runner (information overload)
  • Removed redundant current cluster name label (tab highlight makes it redundant)
  • Extracted sortSlurmNodes() shared helper (eliminates duplicated sort logic)
  • Extracted navigateByDelta() to Layout.ts (bracket tab nav now uses module)
  • Removed dead code (renderGpuAssignmentPanel, stale click state vars)

Full Changelog: v0.3.3...v0.3.6

v0.3.3

01 Mar 22:25

Choose a tag to compare

v0.3.3

Refactor

  • Modular TUI architecture: split monolithic index.ts into src/ modules (types, state, api, utils, components, views)
  • Phase3 state sync bridge: unified global state across modules, replaced render functions with module imports

New Features

  • GPU Assignment panel: pin specific GPUs to My GPUs bundle from the command runner
  • Sparklines & memory progress bars: denser, more readable GPU data in detail and My GPU views
  • My GPU split-pane layout: redesigned My GPU View with split pane
  • Global tab bar & footer: unified layout, reduced visual noise
  • Explicit GPU pinning: support pinning GPUs to My GPUs bundle

Bug Fixes

  • Red-team P0/P1 audit fixes: F-01~F-07 (Python indent, stderr double-read, dual isPolling, stale popup ref, job mutation rollback, gpuIdleStart sync, boundary check)
  • Fixed runner pane overflow and auto exclusion
  • Fixed modal focus/input state bleed
  • Fixed misplaced imports from template literal to file top

Tests

  • 19 automated TUI scenario tests (15 + 4 edge-cases: GPU exclusion, kill/alloc modals, queue mode)

Full Changelog: v0.3.0...v0.3.3

Full Changelog: v0.3.0...v0.3.3

v0.3.0

28 Feb 17:39

Choose a tag to compare

v0.3.0

New Features

  • Multi-cluster tab bar: unified tab bar for SSH clusters + Slurm clusters with Tab/Shift+Tab navigation
  • Slurm cluster monitoring: GPU overview via sinfo/squeue/scontrol through Slurm login node SSH
  • Job dispatch from TUI: sbatch sleep infinity allocation, GPU IDX tracking, cancel/resubmit from popup
  • QoS picker: fetch partition QoS list, cycle through with Q key
  • Command edit mode in popup: e to edit srun command inline, r to reset
  • Version check in tab bar: shows opensmi@0.3.0 → 0.3.1 ↑ in yellow when update available
  • Tab click support: click tab to switch cluster

Onboarding Improvements

  • Redesigned multi-step wizard with cluster grouping, Slurm section, and final review step
  • Admin username default is now idk (skip → stored as null); real admin sets their own username
  • Done card now suggests opensmi poll or opensmi (TUI) as next steps

Bug Fixes

  • Fixed onClickonMouseUp (BoxOptions type compliance)
  • Fixed keyboard shortcut hint formatting: [↑↓] notation, [Shift+r] case
  • Fixed --all flag reading slurm_clusters from root JSON in clusters[] format
  • Fixed pip editable install path after worktree cleanup

Full Changelog: v0.2.5...v0.3.0

v0.2.5

20 Feb 15:05

Choose a tag to compare

v0.2.5 overwritten with additional hardening and UX updates.

Latest addition:

  • Command Runner focus UX: clicking outside runner (above pane) now unfocuses; clicking runner pane again toggles unfocus.

Included hardening snapshots:

  • fix(core): enforce allocation policy and harden ssh retries
  • fix(storage): use atomic writes for config and state persistence
  • fix(executor): harden tmux artifact writes and cleanup paths
  • fix(lifecycle): cleanup tmux artifacts on terminal job transitions
  • chore(git): ignore opencode handoff workspace

Validation rerun before overwrite:

  • ./scripts/check.sh (181 tests + TUI checks pass)
  • make build && make build-cli (pass)

Full Changelog: v0.2.4...v0.2.5

v0.2.4

20 Feb 07:46

Choose a tag to compare

What's New

Fixed

  • opensmi update wrapper bug: After running opensmi update, the CLI wrapper was still being regenerated as #!/usr/bin/env bash. Now correctly writes #!/bin/sh (POSIX).

Who this affects: Users who installed via pyz (default method) and ran opensmi update — the wrapper is now properly replaced with the POSIX version. zsh, bash, and sh users all get the fixed wrapper after updating.

Upgrade path:

opensmi update

No uninstall needed.


Full changelog: https://github.com/seilk/opensmi/blob/main/CHANGELOG.md

Full Changelog: v0.2.3...v0.2.4

v0.2.3

20 Feb 07:40

Choose a tag to compare

What's New

Added

  • TUI header: user@hostname now shown in the top bar

Changed

  • TUI header: Removed Expiring<24h field (cleaner header)

Fixed

  • install.sh / install-cli.sh: Shell compatibility overhaul
    • pyz wrapper POSIX-ified (#!/bin/sh) — no bash required on Alpine/slim envs
    • Shell auto-detection: precise PATH hint per shell (zsh → .zshrc, bash/macOS → .bash_profile, bash/Linux → .bashrc, fish → set -gx)
    • Interactive TTY: auto-append to profile with [Y/n] prompt (skipped on curl | bash)
    • Bash guard: clear error + correct command when run with sh by mistake

Full changelog: https://github.com/seilk/opensmi/blob/main/CHANGELOG.md

Full Changelog: v0.2.2...v0.2.3

v0.2.2

20 Feb 06:25

Choose a tag to compare

What's New

Added

  • is_local_node(): Bypass SSH for local GPU server — faster execution, no SSH config needed
  • Jobs tab: tmux session cleanup action for finished sessions
  • Jobs tab: Retry selected session command from detail view

Fixed

  • Setup: Block dispatch when setup save fails (prevents data loss)
  • Setup: Persist setup edits before job submit/dispatch

Full changelog: https://github.com/seilk/opensmi/blob/main/CHANGELOG.md

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

v0.2.1

19 Feb 08:36

Choose a tag to compare

Full Changelog: v0.2.0...v0.2.1

v0.2.0

18 Feb 18:10

Choose a tag to compare

What's Changed

  • Integrate lion+raven updates (slim telemetry, TUI UX, SSH retry) by @seilk in #2
  • Dynamic GPU column count in dashboard by @seilk in #1
  • feat: TUI command runner with auto GPU selection and launch orchestration by @seilk in #3
  • fix: add missing launch screen case in render() switch by @seilk in #4

New Contributors

  • @seilk made their first contribution in #2

Full Changelog: v0.1.1...v0.2.0