Repository navigation
v0.2.4
[0.2.4] - 2026-03-11
Added
- WASM Plugin Runtime - Full WebAssembly plugin support via Extism:
- Load
.wasmplugins alongside Lua and Rhai scripts - Hook dispatch, method invocation, and isolated execution contexts
- Automatic hook discovery by inspecting WASM exports
- Load
- Plugin System Integration - TUI now initializes and dispatches lifecycle hooks:
OnStartup,OnShutdown,OnNavigate,OnScanCompletehooks- Plugin manager with Lua, Rhai, and WASM runtimes registered at startup
- Non-blocking hook dispatch via
tokio::spawnfor 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
- Modified (
- 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
Vto enter visual mode - Use
j/kto extend selection up/down - Selected range highlighted
Escexits and marks the selected range- Works seamlessly with existing mark system
- Press
- 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_functionwithEngine::call_fnusing 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_metadatainstead 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 onSandboxConfig.can_read()viaArc-shared config - HIGH: Plugin sandbox bypass (Lua) -
LuaRuntimenow stores and passesSandboxConfigtocreate_fs_apiinstead ofNone - 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_pathsnow deny by default instead of granting unrestricted access - MED: Lua
fs.read_bytesunbounded read - UsesFile::open().take(limit).read_to_end()instead of full allocation - MED: Lua instruction timeout bypass - Wrapped isolate execution in
tokio::time::timeoutfor 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_handleAPIs (file_index(),number_of_links()) with stable fallbacks; hardlink dedup skipped on Windows - Move undo pipeline - Added
MoveCompletestruct carryingmoved_pairsfrom move operations, enabling proper undo recording - Cross-filesystem undo - Undo now falls back to copy+delete when
fs::renamefails across filesystems - Windows symlink - Choose
symlink_dirvssymlink_filebased 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
ScanConfigdefaults ContentHashtest helpers updated forBox<ContentHash>optimization- Duplicate finder tests fixed for correct file count assertions
Changed
- API Modernization - ~25 function signatures changed from
&PathBufto&Pathacross 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
DashMapwithHashMapsince access is single-threaded; ~15% faster inode tracking - GlobSet reuse - Scanner reuses
ScanConfig's pre-compiledGlobSetwith fallback compilation for builder-created configs - Progress counter - Replaced
Arc<AtomicU64>with plainu64in sequential scan loop truncate_to_width- Extracted shared function toui/mod.rs, eliminating 3-way duplicationTuiConfig- 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 -
FilesDeletedvariant now storespaths: Vec<PathBuf>;can_undo()always returnsfalsefor deletions - HookResult Serialization - Added
Serialize/Deserializederives for WASM interop - Dependencies Updated - All workspace dependencies brought to latest versions
Full Changelog: v0.2.3...v0.2.4