Releases: seilk/opensmi
v0.4.0
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
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
onMouseUpfocus 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
v0.3.3
Refactor
- Modular TUI architecture: split monolithic
index.tsintosrc/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
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/scontrolthrough Slurm login node SSH - Job dispatch from TUI:
sbatch sleep infinityallocation, GPU IDX tracking, cancel/resubmit from popup - QoS picker: fetch partition QoS list, cycle through with
Qkey - Command edit mode in popup:
eto edit srun command inline,rto 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 asnull); real admin sets their own username - Done card now suggests
opensmi polloropensmi(TUI) as next steps
Bug Fixes
- Fixed
onClick→onMouseUp(BoxOptionstype compliance) - Fixed keyboard shortcut hint formatting:
[↑↓]notation,[Shift+r]case - Fixed
--allflag readingslurm_clustersfrom root JSON in clusters[] format - Fixed pip editable install path after worktree cleanup
Full Changelog: v0.2.5...v0.3.0
v0.2.5
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
What's New
Fixed
opensmi updatewrapper bug: After runningopensmi 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
What's New
Added
- TUI header:
user@hostnamenow shown in the top bar
Changed
- TUI header: Removed
Expiring<24hfield (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 oncurl | bash) - Bash guard: clear error + correct command when run with
shby mistake
- pyz wrapper POSIX-ified (
Full changelog: https://github.com/seilk/opensmi/blob/main/CHANGELOG.md
Full Changelog: v0.2.2...v0.2.3
v0.2.2
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
Full Changelog: v0.2.0...v0.2.1
v0.2.0
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
Full Changelog: v0.1.1...v0.2.0