feat/phase2 #1

Merged
JMR-dev merged 17 commits from feat-phase2 into main 2026-06-17 20:45:19 +00:00
JMR-dev commented 2026-06-17 20:36:13 +00:00 (Migrated from github.com)

Phase 2: Tabs, search, resizable columns, WSL browsing, and thumbnails

Overview

Phase 2 builds out Librarian from a single-folder viewer into a multi-tab file explorer with recursive search, a details view with resizable/auto-fitting columns,
WSL filesystem browsing, and an icon/thumbnail grid view. It also adds CI/release automation, a ripgrep provisioning script, and a round of correctness hardening.
~6,800 lines across 38 files.

Features

Tabs — Multiple folder tabs with independent navigation history, view mode, scroll position, column layout, and search state. Per-tab state is parked/restored on
tab switch.

Recursive search — Backed by an external ripgrep process (files-only), with two modes (Name / Contents), streaming results into the list as they arrive, debounced
input, and a cancellable subscription. ripgrep is invoked via an argv array (no shell) with -e/-- sentinels so queries can never be interpreted as flags. New
scripts/install-ripgrep.ps1 provisions rg.exe as a pre-install step; crates/librarian-core/src/matcher.rs handles match logic.

Resizable details columns — Exact text-measurement-based auto-fit, draggable dividers, and per-folder persisted column widths. New columns.rs, metrics.rs, and
ellipsis.rs (tooltip-on-truncation).

WSL browsing — A "Linux" navigation group enumerating installed distros via the Lxss registry and browsing them over \wsl.localhost<distro> UNC paths. New wsl.rs
in both librarian-win and the app tree.

Icons & thumbnails view — Grid view with shell-extracted icons/thumbnails loaded off-thread on a dedicated worker, with a modal spinner overlay that draws over
existing content (no blanking/reflow). New thumbs.rs, icons.rs, expanded icon.rs.

Folder tree — Left-pane expandable navigation tree (tree.rs).

App icon & packaging — Embedded librarian.ico via build.rs/winresource; CI workflow (unit tests on windows-2025) and a workflow_dispatch release workflow that
builds, generates a SHA256, and publishes. All GitHub Actions pinned by commit SHA.

Hardening & correctness fixes

The later commits in this branch carry fixes from a code review, a /simplify quality pass, and a crash-class review (see docs/):

  • Row identity across re-sorts — inline rename and mid-stream search selection now carry the file path, not a positional row index, so a background recompute_rows()
    re-sort can't rename or act on the wrong file.
  • Stale producer guards — background drive/WSL enumeration and disk-change reloads now carry a load token and refuse to clobber a newer view or an active search.
  • Unified loading overlay — folder loads use the same modal spinner as thumbnail loading (no column "pinch", previous folder stays visible under the scrim).
  • Window arithmetic hardening — saturating_* in grid/virtualized window math guards against overflow/inverted ranges from stale scroll offsets (the crash-class
    window_for fix).
  • Config validation — rejects non-finite persisted column widths.
  • Dedup/altitude cleanups — shared cmp_name_str, extension_of, and is_wsl_host helpers hoisted into librarian-core; dead name_filter filtering seam removed.

Testing

cargo check, clippy, and fmt --check clean across the workspace; 86 tests pass (23 core, 13 win, 50 app).

Docs

  • docs/phase2_simplify_review.md — quality pass writeup
  • docs/crash_class_review_filepilot.md — defensive review vs. an external NULL-write crash class
  • docs/debug_log.md — fix log
Phase 2: Tabs, search, resizable columns, WSL browsing, and thumbnails Overview Phase 2 builds out Librarian from a single-folder viewer into a multi-tab file explorer with recursive search, a details view with resizable/auto-fitting columns, WSL filesystem browsing, and an icon/thumbnail grid view. It also adds CI/release automation, a ripgrep provisioning script, and a round of correctness hardening. ~6,800 lines across 38 files. Features Tabs — Multiple folder tabs with independent navigation history, view mode, scroll position, column layout, and search state. Per-tab state is parked/restored on tab switch. Recursive search — Backed by an external ripgrep process (files-only), with two modes (Name / Contents), streaming results into the list as they arrive, debounced input, and a cancellable subscription. ripgrep is invoked via an argv array (no shell) with -e/-- sentinels so queries can never be interpreted as flags. New scripts/install-ripgrep.ps1 provisions rg.exe as a pre-install step; crates/librarian-core/src/matcher.rs handles match logic. Resizable details columns — Exact text-measurement-based auto-fit, draggable dividers, and per-folder persisted column widths. New columns.rs, metrics.rs, and ellipsis.rs (tooltip-on-truncation). WSL browsing — A "Linux" navigation group enumerating installed distros via the Lxss registry and browsing them over \\wsl.localhost\<distro> UNC paths. New wsl.rs in both librarian-win and the app tree. Icons & thumbnails view — Grid view with shell-extracted icons/thumbnails loaded off-thread on a dedicated worker, with a modal spinner overlay that draws over existing content (no blanking/reflow). New thumbs.rs, icons.rs, expanded icon.rs. Folder tree — Left-pane expandable navigation tree (tree.rs). App icon & packaging — Embedded librarian.ico via build.rs/winresource; CI workflow (unit tests on windows-2025) and a workflow_dispatch release workflow that builds, generates a SHA256, and publishes. All GitHub Actions pinned by commit SHA. Hardening & correctness fixes The later commits in this branch carry fixes from a code review, a /simplify quality pass, and a crash-class review (see docs/): - Row identity across re-sorts — inline rename and mid-stream search selection now carry the file path, not a positional row index, so a background recompute_rows() re-sort can't rename or act on the wrong file. - Stale producer guards — background drive/WSL enumeration and disk-change reloads now carry a load token and refuse to clobber a newer view or an active search. - Unified loading overlay — folder loads use the same modal spinner as thumbnail loading (no column "pinch", previous folder stays visible under the scrim). - Window arithmetic hardening — saturating_* in grid/virtualized window math guards against overflow/inverted ranges from stale scroll offsets (the crash-class window_for fix). - Config validation — rejects non-finite persisted column widths. - Dedup/altitude cleanups — shared cmp_name_str, extension_of, and is_wsl_host helpers hoisted into librarian-core; dead name_filter filtering seam removed. Testing cargo check, clippy, and fmt --check clean across the workspace; 86 tests pass (23 core, 13 win, 50 app). Docs - docs/phase2_simplify_review.md — quality pass writeup - docs/crash_class_review_filepilot.md — defensive review vs. an external NULL-write crash class - docs/debug_log.md — fix log
Sign in to join this conversation.