Skip to content

Releases: Epistates/gravityfile

v0.2.4

11 Mar 20:54

Choose a tag to compare

[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

v0.2.3

11 Mar 19:13

Choose a tag to compare

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

gravityfile v0.2.2

16 Jan 13:08

Choose a tag to compare

[0.2.2] - 2026-01-16

Fixed

  • Critical: Safe Deletion with Trash - All deletions now move files to system trash instead of permanent deletion, allowing recovery of accidentally deleted files
  • Critical: Symlink Safety - Fixed symlink handling across all file operations to prevent accidental deletion of symlink targets:
    • Uses symlink_metadata() instead of is_dir() to avoid following symlinks
    • Symlinks are always removed as files, never following their targets
    • Applies to delete, copy, move, and undo operations
  • Critical: Errors View Delete Behavior - Pressing d in Errors view now correctly deletes the selected broken symlink, not items from the Explorer view
  • Delete Confirmation Modal - Now shows full paths (truncated from left if needed) instead of just filenames, with type indicators (🔗 for symlinks, 📁 for directories)
  • Errors View Toggle Mark - Space key now properly marks/unmarks broken symlinks in Errors view

Added

  • Errors View Footer Hints - Shows available actions (Spc to select, d to delete, Esc to clear)
  • Errors View Delete Hint - Selected broken symlinks show [d to delete] hint
  • Errors View Mark Indicator - Marked items show [x] prefix
  • Comprehensive Symlink Tests - Added tests for deleting symlinks to files, directories, broken symlinks, symlink chains, and directories containing symlinks

Changed

  • Delete confirmation now says "Move to trash?" instead of "cannot be undone"
  • Success messages now say "Moved to trash" instead of "Deleted"

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

v0.2.1

17 Dec 23:05

Choose a tag to compare

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

v0.2.0

13 Dec 13:37

Choose a tag to compare

[0.2.0] - 2025-12-13

Added

  • Miller Columns Layout - Ranger-style three-pane view (Parent | Current | Preview), toggle with v or :layout miller
  • File Operations - Full clipboard support with vim-style keybindings:
    • y - Yank (copy) to clipboard
    • x - Cut to clipboard
    • p - Paste from clipboard
    • r - Rename file/directory
    • a - Create new file
    • A - Create new directory
    • T - Take (mkdir + cd into new directory)
  • Conflict Resolution - Interactive handling for file conflicts during copy/move operations
  • Cross-Platform Releases - GitHub Actions workflow for automated releases:
    • Linux x86_64 and ARM64
    • macOS Intel and Apple Silicon (with optional code signing/notarization)
    • Windows x86_64
  • CI Pipeline - Automated build and test on push/PR to main

Changed

  • Improved navigation with history preservation across drill-down operations
  • Enhanced details panel with more file metadata

Full Changelog: v0.1.3...v0.2.0

GravityFile v0.1.3

09 Dec 22:49

Choose a tag to compare

Fix UX during delete operations

Full Changelog: v0.1.2...v0.1.3

GravityFile v0.1.2

09 Dec 18:27

Choose a tag to compare

Initial public release