Skip to content

v0.2.4

Choose a tag to compare

@github-actions github-actions released this 11 Mar 20:54
· 75 commits to main since this release

[0.2.4] - 2026-03-11

Added

  • WASM Plugin Runtime - Full WebAssembly plugin support via Extism:
    • Load .wasm plugins alongside Lua and Rhai scripts
    • Hook dispatch, method invocation, and isolated execution contexts
    • Automatic hook discovery by inspecting WASM exports
  • Plugin System Integration - TUI now initializes and dispatches lifecycle hooks:
    • OnStartup, OnShutdown, OnNavigate, OnScanComplete hooks
    • Plugin manager with Lua, Rhai, and WASM runtimes registered at startup
    • Non-blocking hook dispatch via tokio::spawn for scan-complete events
  • Git Status Integration - Real-time git status indicators in file listings:
    • Modified (M), Staged (A), Untracked (?), Ignored (!), Conflict (C) indicators
    • Color-coded status using theme colors (modified=yellow, staged=green, etc.)
    • Automatic detection of git repositories
    • Works in both Tree and Miller column views
  • Treemap Visualization - Squarified treemap view for disk usage analysis:
    • Space-filling rectangular layout showing relative file/directory sizes
    • Color intensity based on size ratio
    • Keyboard navigation (arrow keys, Enter to drill down, Backspace to go up)
    • Directory/file indicators with different border styles
    • Size labels displayed within rectangles
  • Visual Mode - Vim-style range selection:
    • Press V to enter visual mode
    • Use j/k to extend selection up/down
    • Selected range highlighted
    • Esc exits and marks the selected range
    • Works seamlessly with existing mark system
  • Archive Support - Create and extract archives with full format support:
    • Supported formats: ZIP, TAR, TAR.GZ, TAR.BZ2, TAR.XZ
    • Commands: :extract [destination], :compress <name.zip|tar|tar.gz|...>
    • Archive preview: Shows file listing with sizes, compression ratios, and symlink indicators
    • Symlink support: Preserves symlinks in archives (ZIP via Unix mode, TAR via link headers)
    • Loop detection: Prevents infinite recursion when archiving circular symlinks

Security

  • CRIT: Rhai code injection - Replaced string interpolation in call_function with Engine::call_fn using typed args and stored AST, eliminating arbitrary code execution via plugin args
  • CRIT: TAR decompression bomb bypass - Size limits now check actual bytes written to disk via symlink_metadata instead of trusting attacker-controlled header sizes
  • CRIT: Cross-filesystem move data loss - Added cleanup on partial copy failure and warning on source removal failure to prevent duplicate/orphaned content
  • HIGH: Plugin sandbox bypass (Rhai) - All fs_* functions now gate on SandboxConfig.can_read() via Arc-shared config
  • HIGH: Plugin sandbox bypass (Lua) - LuaRuntime now stores and passes SandboxConfig to create_fs_api instead of None
  • HIGH: Plugin sandbox bypass (WASM) - Manifest now maps sandbox config to allowed_paths, memory limits, timeout; WASI disabled by default
  • MED: ZIP symlink escape - Deferred symlink extraction to second pass preventing symlink-redirected create_dir_all
  • MED: Chained symlink attack - Always validate symlink targets against canonical destination, not only when .. present
  • MED: Empty sandbox = full access - Empty allowed_read_paths/allowed_write_paths now deny by default instead of granting unrestricted access
  • MED: Lua fs.read_bytes unbounded read - Uses File::open().take(limit).read_to_end() instead of full allocation
  • MED: Lua instruction timeout bypass - Wrapped isolate execution in tokio::time::timeout for wall-clock enforcement alongside instruction counter
  • Archive extraction hardened with path traversal prevention, ZIP bomb detection, and symlink escape prevention

Fixed

  • Windows build - Replaced unstable windows_by_handle APIs (file_index(), number_of_links()) with stable fallbacks; hardlink dedup skipped on Windows
  • Move undo pipeline - Added MoveComplete struct carrying moved_pairs from move operations, enabling proper undo recording
  • Cross-filesystem undo - Undo now falls back to copy+delete when fs::rename fails across filesystems
  • Windows symlink - Choose symlink_dir vs symlink_file based on target type; log failures instead of silent discard
  • Fuzzy search highlights - Fixed misalignment on non-ASCII filenames by using character positions instead of byte offsets to match nucleo's UTF-32 indices
  • Viewport height - Correctly subtracts 5 rows when directory tabs are visible instead of always 4
  • Git pathspec - Empty relative path at repo root now produces ** instead of /**
  • Filename validation - Uses byte length (name.len() > 255) matching OS enforcement instead of char count
  • Archive symlink icon - Symlinks in archive preview now show distinct @ icon instead of directory icon
  • Doc link warnings - Escaped [PATH] in doc comments to prevent rustdoc treating them as links
  • Broken doc comment continuation in plugin crate module docs
  • Test assertions updated to match actual ScanConfig defaults
  • ContentHash test helpers updated for Box<ContentHash> optimization
  • Duplicate finder tests fixed for correct file count assertions

Changed

  • API Modernization - ~25 function signatures changed from &PathBuf to &Path across all crates, following Rust idioms for borrowed path parameters
  • Clippy Clean - Eliminated all clippy warnings across the workspace (let-chains, derive Default, redundant closures, clamp, strip_prefix, etc.)
  • InodeTracker - Replaced DashMap with HashMap since access is single-threaded; ~15% faster inode tracking
  • GlobSet reuse - Scanner reuses ScanConfig's pre-compiled GlobSet with fallback compilation for builder-created configs
  • Progress counter - Replaced Arc<AtomicU64> with plain u64 in sequential scan loop
  • truncate_to_width - Extracted shared function to ui/mod.rs, eliminating 3-way duplication
  • TuiConfig - Added #[non_exhaustive] to prevent future breakage from field additions
  • Cross-device filter - Extended to non-directory entries (files and symlinks), not just directory pruning
  • Undo System Simplification - FilesDeleted variant now stores paths: Vec<PathBuf>; can_undo() always returns false for deletions
  • HookResult Serialization - Added Serialize/Deserialize derives for WASM interop
  • Dependencies Updated - All workspace dependencies brought to latest versions

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