Implement the password-store tree sidebar #18

Closed
opened 2026-08-09 19:10:34 +00:00 by hugo · 1 comment
Owner

Objective

Implement the Mutt-style password-store tree sidebar and keyboard-first navigation.

Scope

  • Render storage-provided folders and entries as an indented, collapsible tree with a clear current selection.
  • Support j/k and arrow navigation, page up/down, first/last, parent/child movement, expand/collapse and Enter to open.
  • Add incremental filtering and find navigation without decrypting entries.
  • Preserve selection and expansion state across refreshes, mutations and Git synchronization when the selected object still exists.
  • Provide locked, changed and conflict indicators supplied by storage state without inferring them from names.

Acceptance criteria

  • Navigation is deterministic for empty, deep, Unicode and very large trees.
  • Selection never points at a deleted or filtered-out object.
  • Sidebar actions call storage APIs and never access the vault filesystem directly.
  • Snapshot tests cover hierarchy, scrolling, focus, filtering and terminal resizing.

Prerequisites

Mutt-style TUI shell and action model.

## Objective Implement the Mutt-style password-store tree sidebar and keyboard-first navigation. ## Scope - Render storage-provided folders and entries as an indented, collapsible tree with a clear current selection. - Support `j`/`k` and arrow navigation, page up/down, first/last, parent/child movement, expand/collapse and Enter to open. - Add incremental filtering and find navigation without decrypting entries. - Preserve selection and expansion state across refreshes, mutations and Git synchronization when the selected object still exists. - Provide locked, changed and conflict indicators supplied by storage state without inferring them from names. ## Acceptance criteria - Navigation is deterministic for empty, deep, Unicode and very large trees. - Selection never points at a deleted or filtered-out object. - Sidebar actions call storage APIs and never access the vault filesystem directly. - Snapshot tests cover hierarchy, scrolling, focus, filtering and terminal resizing. ## Prerequisites Mutt-style TUI shell and action model.
hugo added this to the 02 - Mutt-style terminal UI milestone 2026-08-09 19:10:34 +00:00
hugo added the enhancement label 2026-08-09 19:10:34 +00:00
Author
Owner

Implemented in commit 91f58ba and pushed to main.

Implementation:

  • Loads the storage-owned TreeModel asynchronously through Config, Repository, KeyStore, and VaultReader APIs; the TUI never reads the vault filesystem itself.
  • Renders indented folders and entries with stable path-plus-kind identities, collapse/expand state, clear selection, scrolling, and typed locked/changed/conflict indicators supplied by storage.
  • Adds j/k and arrow navigation, page up/down, first/last, parent/child, Enter open-or-toggle, refresh, incremental slash filtering, and n/N match navigation through the central action registry.
  • Executes refresh and each incremental find off the input thread. Find uses VaultReader::find without decryption, retains storage-reported matches separately from ancestor folders, and rejects stale out-of-order results.
  • Preserves selection and expansion across replacement trees when objects still exist and deterministically repairs selection when an object disappears.

Verification:

  • cargo fmt --all -- --check
  • RUSTFLAGS="-D warnings" cargo check --workspace --all-targets
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test --workspace
  • 27 focused TUI tests pass, covering empty, Unicode, 128-level deep, 1,000-item, and entry/directory-collision trees; navigation, paging, filtering, actual-match cycling, refresh repair, hierarchy, scrolling, focus, indicators, and resizing.
Implemented in commit 91f58ba and pushed to main. Implementation: - Loads the storage-owned TreeModel asynchronously through Config, Repository, KeyStore, and VaultReader APIs; the TUI never reads the vault filesystem itself. - Renders indented folders and entries with stable path-plus-kind identities, collapse/expand state, clear selection, scrolling, and typed locked/changed/conflict indicators supplied by storage. - Adds j/k and arrow navigation, page up/down, first/last, parent/child, Enter open-or-toggle, refresh, incremental slash filtering, and n/N match navigation through the central action registry. - Executes refresh and each incremental find off the input thread. Find uses VaultReader::find without decryption, retains storage-reported matches separately from ancestor folders, and rejects stale out-of-order results. - Preserves selection and expansion across replacement trees when objects still exist and deterministically repairs selection when an object disappears. Verification: - cargo fmt --all -- --check - RUSTFLAGS="-D warnings" cargo check --workspace --all-targets - cargo clippy --workspace --all-targets -- -D warnings - cargo test --workspace - 27 focused TUI tests pass, covering empty, Unicode, 128-level deep, 1,000-item, and entry/directory-collision trees; navigation, paging, filtering, actual-match cycling, refresh repair, hierarchy, scrolling, focus, indicators, and resizing.
hugo closed this issue 2026-08-10 06:07:38 +00:00
Sign in to join this conversation.