Releases: almeidx/versi
Releases · almeidx/versi
v0.12.3
Immutable
release. Only release title and notes can be modified.
[0.12.3] - 2026-03-08
- fix: prevent ETXTBSY in mock executable tests
- fix: sync mock executable to disk before exec to prevent ETXTBSY
- fix: add tooltip explaining disabled launch-at-login toggle
- fix: escape apostrophes in macOS launch agent XML
- refactor: extract shared advisory platform-matching helper
- fix: use atomic write for shell config to prevent data loss
- deps: Update Rust crate base64 to 0.22.1 (#89)
- fix: fetch volta install script from GitHub instead of get.volta.sh
- fix: verify SHA-256 checksum for asdf binary downloads
- docs: add versi-asdf backend to CLAUDE.md
- refactor: replace wildcard re-exports in state/mod.rs with explicit imports
- refactor: extract hardcoded green color to SUCCESS theme token
- refactor: consolidate duplicated installed() test helper
- security: verify installer scripts via GitHub Contents API
- refactor: use NodeVersion instead of String in BulkRunItem and related APIs
- perf: single-pass BulkProgressSnapshot construction
- perf: cache prepared security advisories to avoid re-parsing semver
- fix: use wrapping_add for next_toast_id to prevent debug-mode panic
- fix: wrap refresh_rotation to [0, TAU) during loading
- security: pass version via env var in fnm script wrapper on Linux
- security: use tempfile for installer scripts to prevent symlink attacks
- security: restrict open_url_task to HTTPS-only URLs
- security: validate download URL domain before fetching update binary
- fix: replace unreachable!() with error return on Windows non-MSI path
- fix: return false for unparseable versions in is_newer_version
- test: add tests for update parsing, security advisories, and banner helpers
- refactor: use NodeVersion instead of String in Operation and Message types
- refactor: consolidate duplicated test fixtures and helpers
- perf: eliminate duplicate widget tree construction in views
- refactor: extract is_dark theme helper to replace 11 inline checks
- perf: pre-parse VersionReq for security advisory checks
- fix: re-verify checksum before pkexec cp to close TOCTOU race
- perf: use Arc for cache save data to avoid full clones
- fix: use unsigned_abs for Windows exit code cast
- fix: track loaded state to prevent redundant reloads
- fix: add consistent timeouts to all network fetch operations
- fix: prevent Windows registry key handle leak in set_launch_at_login
- fix: harden auto-update security
- fix: sanitize imported settings and apply side-effects
- fix: scope WSL shell config flag detection to marker lines
- fix: clear hovered version on search query change
- fix: trim version strings in is_newer_version fallback comparison
- refactor: rename _file to _lock_file in SingleInstance
- fix: correct toast expiry off-by-one
- fix: correct subject-verb agreement in vulnerability banner
- fix: preserve pending installs for actively-running versions in drain
- fix: recompute banner stats after tray environment switch
- fix: add reply timeout to dbus-send in tray host detection
- fix: prevent proceeding past failed backend install in onboarding
- fix: correct malformed macOS LaunchAgent plist XML
v0.12.2
Immutable
release. Only release title and notes can be modified.
v0.12.1
Immutable
release. Only release title and notes can be modified.
[0.12.1] - 2026-03-06
- refactor: replace fd-lock with std File::try_lock
- refactor: restrict version parse functions to pub(crate) visibility
- refactor: remove redundant test_ prefix from test function names
- refactor: avoid unnecessary clone in NVM provider detect
- refactor: add missing Debug derive to FnmBackend and AsdfBackend
- refactor: restrict NVM internal types and functions to pub(crate) visibility
- refactor: restrict update check functions to pub(crate) visibility
- refactor: make commands module private in versi-core
- refactor: remove unused public re-exports
- refactor: remove duplicated format tests from version list item
- refactor: remove unused shells re-export module
- perf: avoid intermediate allocation in response_snippet
- refactor: extract shared combine_error_output helper
- refactor: remove unused public re-exports from backend crates
- refactor: reduce public API surface of internal symbols
- refactor: remove unused methods and dead code
- refactor: extract shared run_unix_install_script helper
- refactor: remove redundant data_dir clone and with_asdf_data_dir call
- perf: avoid unnecessary String allocations in update check and banner formatting
- refactor: derive Copy for NvmVariant and ApplyResult
- refactor: remove duplicate shell_type_to_str in favor of ShellType::shell_arg
- refactor: derive Copy for ShellType and pass by value
- refactor: extract shared write_mock_executable! macro to versi-backend
- perf: use split_once and avoid intermediate allocations in shell config
- chore: update Cargo.lock after sha2 removal from versi-asdf
- refactor: reduce public API surface of internal symbols
- refactor: use &Path instead of &PathBuf in function parameters
- refactor: remove unused ShellConfigEdit.original field and diff_preview method
- refactor: remove unused download_install_script_verified and related dead code
- refactor: add #[must_use] to ShellConfig::add_init and update_flags
- refactor: use &Path instead of &PathBuf in nvm detection
- test: remove duplicate is_newer_version tests from versi-nvm
- chore: remove unused sha2 dependency from versi-asdf
- perf: derive Copy for NodeVersion and remove redundant clones
- refactor: extract download_and_prepare_install_script to versi-backend
- fix: add missing User-Agent headers to 4 HTTP request functions
- refactor: standardize logging levels across all backends
- refactor: remove AppError::Message variant and serde_json string escape hatch
- perf: optimize toast IDs, fetch clones, and environment load dedup
- refactor: standardize User-Agent to Versi/{version} across all HTTP clients
- refactor: deduplicate version prefix stripping and fix sentinel check
- refactor: remove unused install_date field from InstalledVersion
- refactor: replace fs2 with fd-lock for file locking
- refactor: remove unused execute_in_wsl and WslError from versi-platform
- perf: use full LTO for smaller release binaries
- test: add diagnostic output to fnm mock command failure test
- test: add compile-time safety tests for BackendKind/provider name mapping
- test: add tests for auto_update state machine
- test: add tests for shell configuration handlers
- test: add missing provider tests for versi-nvm
- refactor: make FnmBackend::execute delegate to shared execute_backend_command
- fix: use Result::ok method reference in fs_utils tests
- refactor: extract duplicate
replace_fileand quarantine logic to fs_utils module - perf: remove intermediate Vec collect in background preload scheduling
- perf: add fast path for
sanitize_terminal_textwhen input has no escape sequences - refactor: remove dead
fnm_dirandnode_dist_mirrorsettings fields - fix: remove unnecessary
providers.clone()in Versi::new - refactor: merge duplicate
should_confirm_default_uninstall/is_already_default_version - fix: widen timeout test gap for Windows timer granularity
- refactor: deduplicate provider test suites with shared macro
- refactor: extract shared CommandEnvironment and command building to versi-backend
- chore: update Cargo.lock after dependency changes
- refactor: split auto_update.rs into download, extract, and apply phases
- refactor: split state/operations.rs into modal, bulk, and operations
- refactor: extract find_default_version helper to versi-backend
- refactor: remove redundant internal detection structs
- refactor: replace crossbeam-channel with MenuEvent::set_event_handler
- refactor: extract InstallerAttempt to versi-core
- refactor: extract download_install_script to versi-core
- refactor: extract parse_current_version helper to versi-backend
- refactor: extract check_github_backend_update helper to versi-core
- test: add unit tests for get_cli_version prefix-stripping
- refactor: remove duplicate asdf_data_dir field in AsdfBackend
- chore: run formatter
- fix: add nvm prefix to normalize_backend_version_output
- fix: clear fetch errors consistently on retry
- refactor: unify clamp helpers and use default functions in AppSettings
- fix: use cfg(unix) instead of cfg(not(windows)) in settings
- refactor: derive Default for FetchState and VersionCache
- test: add unit tests for format_relative_time
- refactor: deduplicate fetch error banner functions
- refactor: precompute AppPaths in state instead of in view
- refactor: extract items_matching helper in BulkRunState
- perf: precompute LTS codename lookup map instead of O(n) scan
- refactor: extract shared init task builder
- test: add unit tests for is_major_release
- refactor: extract shared format_tenths to dedicated module
- fix: make command_output_to_result tests cross-platform
- chore: run formatter
- refactor: replace into_backend_update with From impl
- refactor: extract shared command execution helper to versi-backend
- perf: reuse shared reqwest::Client instead of creating new instances
- refactor: deduplicate CLI version probe across backends
- test: add unit tests for auto_update helpers
- test: add unit tests for version list filtering and sorting
- refactor: extract shared temp_script_path to versi-core
- refactor: preserve typed context in AppErrorDetail core error conversions
- refactor: extract shared GitHub release check to versi-core
- refactor: remove redundant fnm_dir field from FnmBackend
- refactor: use into_owned() instead of to_string() on Cow
- fix: use typed errors in asdf Windows installer
- fix: scope detect_options to marker lines only
- deps: Update patch/minor dependencies (#84)
- refactor: deduplicate ANSI stripping across backends
- fix: log debug warnings for silent version detection failures
- fix: use typed errors in NVM Windows installer
- perf: reuse shared reqwest::Client in Volta backend
- fix(windows): quote paths in WSL shell command interpolation
- fix: log warnings instead of silently swallowing cache save errors
- refactor: extract duplicated backend update checking to versi-core
- refactor: extract duplicated
response_snippetto shared module - perf: improve startup performance
- fix(windows): convert WSL detection to async with configurable timeouts
- deps: Lock file maintenance (#83)
v0.12.0
Immutable
release. Only release title and notes can be modified.
[0.12.0] - 2026-02-28
- fix(windows): default wgpu to low power preference to prevent startup hang
- chore: run formatter
- chore: remove unwanted changes from changelog
- feat(onboarding): add unsafe backend auto-install flows
- Align backend behavior and tests across managers
- feat: add asdf backend (nodejs plugin)
- feat: add volta backend support
- deps: Update Rust crate objc2 to 0.6.4 (#81)
- deps: Update GitHub Artifact Actions (#80)
- fix: warning on non-windows
- Redesign and center About page content
- Move bulk progress banner to bottom overlay
v0.11.0
Immutable
release. Only release title and notes can be modified.
[0.11.0] - 2026-02-25
- feat: add overlay scrollbars and sticky section headers
- fix: trap scroll on modals
- Integrate Node security advisory warnings and caching
- deps: Update patch/minor dependencies (#78)
- Fix fnm mock command test
- Fix keyboard list-mode version actions and search input bleed
- Implement background env preload
- Add bulk progress and preload envs
- Add bulk operation progress UI
- test(nvm): retry uninstall when target version is active
- test(ci): remove WSL integration tests and workflow job
- Fix tray tooltip update
- test: add backend integration tests and CI workflow
- Add tray tooltip version
- Add detailed install progress
- deps: Update Rust crate zbus to 5.14.0 (#77)
- deps: Lock file maintenance (#76)
v0.10.3
Immutable
release. Only release title and notes can be modified.
[0.10.3] - 2026-02-20
- fix(windows): align launch-at-login registry status type
- fix(clippy): gate home-dir launch error to macOS
- fix(clippy): pass Linux badge worker receiver by reference
- refactor(app): use direct error mappers for environment loads
- docs(agents): codify typed error handling requirements
- refactor(cache): type app-path resolution load errors
- refactor(tray): remove type-erased tray and badge errors
- refactor(app-errors): introduce typed AppError details and mappings
- refactor(platform): type launch-at-login integration errors
- refactor(shell): replace verification string errors with typed enums
- refactor(single-instance): replace string lock errors with typed variants
- refactor(errors): type backend parse/network/install failures
- refactor(update): use GitHub asset digest for verification
- perf(linux): reuse single worker for badge updates
- fix(cache): add structured load errors and corrupt-file quarantine
- fix(network): log configured HTTP client build fallback
- fix(install): verify backend installer scripts with retries
- perf(cache): coalesce incremental saves on bounded worker queue
- perf(settings): debounce non-critical settings writes
v0.10.2
Immutable
release. Only release title and notes can be modified.
[0.10.2] - 2026-02-20
- build(deps): drop reqwest decompression codec features
- build(ui): disable iced defaults with explicit runtime features
- build(deps): minimize reqwest chrono and simplelog features
- fix(windows): restore compile on CI and clean platform warnings
- build(deps): disable tokio defaults and trim tokio-util
- build(deps): reduce default dependency feature surface
- refactor(tests): use main state helpers in app tests
- chore(windows): document Win32 unsafe invariants
- perf(queue): use hash set for install dedup in drain
- perf(version): cut string allocations in hot compare paths
- fix(nvm): avoid path interpolation in shell bootstrap
- fix(tray): route set-default by stable environment id
- fix(storage): use atomic replace semantics on Windows
- fix(tray): make subscription worker shutdown deterministic
- fix(windows): locate Versi window without exact title match
- fix: clippy warning
- perf(search): reduce per-keystroke allocation churn
- refactor(state): simplify latest-by-major recomputation
- refactor(shell): type WSL shell configuration errors
- refactor(platform): type app path resolution errors
- chore: fix formatting
- refactor(auto-update): replace string errors with typed variants
- refactor(core): use typed errors for remote fetch operations
- refactor(tray): replace polling loop with blocking event bridge
- fix(settings): sanitize persisted values and write atomically
- fix(instance): enforce single-instance lock on non-windows
- refactor(update): use semver for app version comparisons
- fix(network): validate HTTP status for metadata and schedule fetches
- fix(wsl): parse distro names with embedded spaces
- fix(platform): quote launch-at-login executable paths
- refactor(security): replace piped installer scripts with downloaded temp scripts
- feat(security): verify update artifacts with published sha256 checksums
- feat(settings): add configurable app update behavior
- fix(wsl): use sh instead of bash in execute_in_wsl for portability
- refactor: preserve io::ErrorKind in BackendError::IoError conversion
- refactor: extract tick rate magic numbers into named constants
- refactor: derive filter chips from a const table instead of a fixed-size array
- refactor: remove trivial NodeVersion::major_group() getter
- refactor: remove redundant
..in Operation::Install match arm - refactor: derive VersionParseError Display/Error via thiserror
- refactor: return static slices from wsl_search_paths instead of Vec
v0.10.1
Immutable
release. Only release title and notes can be modified.
[0.10.1] - 2026-02-19
- refactor: update VersionGroup::from_versions to accept slices instead of vectors
- refactor(platform): single-pass fold for WSL distro summary counts
- refactor(nvm): move ANSI stripping from version parsing to client layer
- fix(shell): return empty config paths when home directory is unavailable
- Replace unsafe byte-offset string slicing in nvm version parsing
- Extract main_state/onboarding_state test helpers to reduce boilerplate
- Use split_once and strip_prefix/suffix in fnm version parsing
- Reuse versi_core::GitHubRelease in nvm update module
- Reduce unnecessary cloning in NvmProvider
- fix(nvm,platform): log debug messages for silent parse failures
- refactor(platform): deduplicate WslDistro construction in parse_wsl_list
- fix(core): sanitize download filename extracted from URL
- refactor(nvm): remove duplicated is_newer_version, use versi-core's
- refactor(views): simplify app_update_badge with badge_btn and external_link_btn helpers
- refactor(theme): extract hardcoded layout dimensions into token constants
- refactor(theme): centralize repeated color literals into token constants
- rename(theme): tahoe → tokens
- refactor(theme): add RADIUS_XS constant and replace hardcoded border radii
- refactor(backend): remove redundant FnmError and NvmError enums
- refactor(backend): replace Box with Arc
- refactor(nvm): remove Mutex anti-pattern from NvmProvider
- fix(backend): return BackendError from check_for_update instead of String
- fix(tray): log warning for unknown menu event IDs
- refactor(views): extract duplicated has_tabs padding into content_padding
- deps: Update Rust crate zip to 8.1.0 (#71)
- chore: fix formatting
- chore(fnm): remove dead _check_fnm_update function and serde_json dep
- refactor(bulk_ops): deduplicate latest_by_major helpers
- refactor(state): unify Operation and OperationRequest enums
- refactor(state): extract FetchState to reduce VersionCache complexity
- chore: remove unused dependencies
- fix(nvm): log suppressed error in default_version()
- fix(shell): use boundary-aware matching for flag removal
- deps: Update patch/minor dependencies (#70)
v0.10.0
Immutable
release. Only release title and notes can be modified.
[0.10.0] - 2026-02-17
- refactor(versions): split fetch and update-check handlers
- refactor(versions): move handler tests into dedicated module file
- refactor(versions): extract cache-save worker module
- perf(search): cache normalized remote version query fields
- refactor(search): centralize shared query and release filter logic
- test(perf): add ignored search and grouping baseline checks
- refactor(banners): precompute update and eol counts in state
- test(metadata): add navigation and banner regression coverage
- refactor(errors): complete runtime migration to typed app errors
- refactor(update): centralize URL open task helper
- refactor(errors): use typed app-update error variants
- refactor(errors): use typed operation failure errors
- build(release): enable thin-lto and binary stripping
- test(filters): add alias and limit-order regression coverage
- refactor(available-row): remove unreachable action branch
- feat(metadata): track metadata fetch errors and show retry banner
- refactor(version-rows): reduce eager string cloning in row actions
- refactor(versions): debounce background cache persistence
- refactor(cache): write disk cache via atomic temp-file replace
- fix(search): apply filters before limits and to alias results
- refactor(errors): add structured app errors for settings and fetch flows
- refactor(version-list): extract group/query predicates with tests
- refactor(async): cancel stale environment and version fetch tasks
- refactor(state): use typed installed version sets
- refactor(search): unify query engine across state and widgets
- refactor(widgets): extract nav state helpers with tests
- refactor(version-list): extract row action and badge logic
- refactor(search): extract chip state helpers and add tests
- docs(crates): expand public crate-level API docs
- refactor(operations): extract queue and toast helpers
- refactor(tray): split tray event handlers into helpers
- refactor(errors): use structured shell and backend variants
- test(state): cover network status and navigation queries
- test(update): cover context-menu dismissal rules
- test(tray-handlers): cover tray event state transitions
- test(tray): cover menu shaping and event parsing
- test(shell): verify status mapping and backend kind
- test(auto-update): cover update-state transitions
- test(onboarding): cover state transitions and shell mapping
- test(init): cover backend selection helpers
- test(app): cover window lifecycle state transitions
- fix(widget): honor version filter limit and add coverage
- test(app): cover remote, schedule, and metadata update handlers
- chore: fix formatting
- test(app): cover environment filters and operation queueing
- test(app): add dispatch coverage for update routing modules
- test(linux): avoid identical match arms in wayland fallback test
- fix(linux): satisfy wayland env lookup fn lifetime bounds
- docs: refresh README and AI guide for current architecture
- style: format rust sources after test expansion
- test: address strict clippy lints in new tests
- test(app): cover bulk operation version selection logic
- test(app): add coverage for theme and single-instance helpers
- test(core): cover auto-update zip extraction helpers
- test(shell): cover verify path selection and wsl guards
- test(app): add cache and logging helper coverage
- test(backends): add error and provider coverage for nvm/backend
- test(ui): cover version size formatting helpers
- test(app): add coverage for async helpers and wayland detection
- test(state): cover constructors and environment state updates
- test(app): add unit coverage for settings and error types
- test(core): add metadata mapping unit tests
- test(fnm): add coverage for provider, detection, and update logic
- test(platform): cover environment and path helpers
- test(backend): cover version manager trait defaults
- chore: fix formatting
- fix: satisfy strict clippy warnings on linux platform
- refactor: store window geometry positions as floats
- docs: add errors sections for public result APIs
- refactor: split large settings and version list views
- refactor: split init and update dispatch handlers
- chore: enable workspace pedantic clippy by default
- refactor: clean pedantic warnings in views and widgets
- refactor: tighten pedantic compliance in app core
- chore: clean pedantic warnings in backend crates
- fix(version-list): remove label-only hover affordance
- fix(version-list): make full row left-clickable
- test(operations): add generated invariant checks for queue draining
- test: cover settings file IO and shell config edit flows
- chore(format): normalize windows overlay icon call formatting
- perf(cache): reduce cloning in latest-by-major recomputation
- refactor(windows): remove unwraps in overlay icon path
- refactor(platform): split platform helpers into per-OS modules
- refactor(app): extract shared async timeout and retry helpers
- fix(async): guard environment and version fetches by request sequence
- refactor(state): store AppError in UI state
- refactor(app): propagate AppError across remaining message flows
- refactor(message): box heavy update payload variants
- refactor(app): introduce typed AppError for core operation flows
- test(app): add update dispatcher routing coverage
- refactor(settings): deduplicate settings save and shell option updates
- chore(clippy): box forwarded messages in update dispatch
- test(environment): cover load failure and recovery paths
- refactor(app): split update dispatcher by domain
- chore(clippy): satisfy strict warnings and format touched code
- refactor(app): move message dispatcher out of app/mod.rs
- fix(environment): surface version load failures instead of swallowing
- test(app): add cross-environment tray/backend regression coverage
- refactor(app): replace raw backend strings with typed BackendKind
- refactor(app): extract settings IO handlers and add dispatcher tests
- fix(nvm): execute commands with argv instead of string parsing
- fix(init): remove leaked fallback string in WSL backend detection
- fix(shell): write WSL shell config changes to target distro
- fix(app): keep active provider aligned with selected environment
- refactor: reduce parameter threading and deduplicate styles
- feat: add right-click context menu on version rows
- deps: Update Rust crate zip to v8 (#67)
v0.9.0
Immutable
release. Only release title and notes can be modified.
[0.9.0] - 2026-02-15
- feat: add version detail modal with inline release metadata
- feat: add launch at login setting with per-platform autostart
- feat: add search filter chips for LTS, installed, not installed, EOL, and active
- fix: remove unnecessary libxdo dependency
- deps: Update patch/minor dependencies (#64)
- fix(windows): update Windows API calls for newer windows crate and add GDI RAII cleanup
- feat: add update badge on app icon and adopt reverse-domain app ID
- fix: update icon and desktop caches in Linux install script
- deps: Lock file maintenance (#63)