diskr 0.1.49

Lightweight terminal file explorer and disk/storage manager for macOS
# Changelog

All notable changes to diskr are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow
[Semantic Versioning](https://semver.org/).

Issue references (`#N`) point to [docs/ISSUES.md](docs/ISSUES.md) or, for
historical entries, to the matching finding in [docs/AUDIT.md](docs/AUDIT.md).

## [Unreleased]

## [0.1.49] - 2026-06-12

### Fixed

- Rename keeps the cursor on the renamed entry after reloads in sorted views,
  instead of falling back to the old row index; restored the missing
  regression test. (#55)

## [0.1.48] - 2026-06-12

### Changed

- Overhauled development docs: added this changelog and an issue tracker
  (`docs/ISSUES.md`), froze `docs/AUDIT.md` as a historical archive, and added
  an agent workflow protocol in `AGENTS.md`.

### Fixed

- Character keys carrying Control/Alt/Super no longer match plain-key
  actions: Ctrl+C cannot trigger rename, Ctrl+D cannot arm Trash deletion,
  and modified characters are not inserted into text inputs. Ctrl+C now
  cancels the active input mode, confirmation, or overlay like Esc; README
  and `--help` key lists updated. (#51)
- A panic now restores the terminal (raw mode off, alternate screen left)
  before the panic message prints, including release builds where
  `panic = "abort"` skips destructors. (#54)
- Reclaim reports no longer double-count nested fixed cache categories:
  parent categories containing other findings are marked as `[subtotal]`
  roll-up rows and excluded from the report total; JSON findings gain a
  `rollup` field. (#46)
- The package detail modal in the Projects view shows the selected project
  dependency row instead of an unrelated system package. (#60)
- `empty_trash` runs `osascript` through an injectable runner; the test suite
  can no longer touch the real Trash, and its doc comment no longer claims
  emptying is reversible. (#44)

## [0.1.47] - 2026-06-12

### Added

- File info popup: `i` in the Files pane opens a modal with full path, type,
  logical vs. allocated size (with APFS clone/sparse/compression note),
  created/modified/accessed timestamps, owner/group, permissions, hard-link
  count, and xattr count with quarantine flagging. Action keys for Quick Look,
  Finder reveal, Open, and Trash. (#20)

## [0.1.46] - 2026-06-12

### Fixed

- Homebrew cask rows now act on the real `.app` bundle: detail, Finder reveal,
  and Open follow the app bundle while uninstall keeps using the cask token.
  The Caskroom metadata path is shown separately when it differs. (#36)

## [0.1.45] - 2026-06-12

### Fixed

- Stabilized the package visibility cache regression test.

## [0.1.44] - 2026-06-12

### Fixed

- Package pane no longer rebuilds visibility indices on every rendered row
  (O(n^2) per frame); visible indices and lowercase search text are cached. (#32)
- npm global package sizing resolves from the active `npm root -g` first, so
  package lists and size lookups stay aligned under nvm/fnm. (#35)
- Top-files and reclaim-paths modals page by visible height and render their
  footers without clipping. (#37)

## [0.1.43] - 2026-06-12

### Fixed

- Size-sorted scan results no longer land on the wrong row: `apply_sort()`
  rebuilds the path-to-index map, so a directory size arriving after a
  mid-scan resort cannot be written onto an unrelated file. (#41)

## 0.1.34 - 0.1.42 (2026-06-11 - 2026-06-12)

Rapid audit-driven fix releases. Reconstructed summary; per-finding detail
lives in [docs/AUDIT.md](docs/AUDIT.md) and git history.

### Added

- Full-subtree scan mode: `S` scans every visible directory whose size is
  missing without invalidating known sizes (0.1.38). (#18)
- Clipboard copy (`y`) and open-in-Terminal (`s`) shortcuts (0.1.39). (#10)

### Fixed

- `Esc` no longer quits from the Files pane; `q` remains quit (0.1.36). (#24)
- Replaced the redundant outer scanner thread layer with a single rayon
  dispatch thread (0.1.37). (#22)
- Stale background package/reclaim results from a previous directory are
  discarded instead of being shown for the current one. (#26)
- Multi-select marks render a checkmark, clear on directory changes, and batch
  delete confirmations list the marked items. (#27)
- Rename follows the renamed entry after reload. (#28; later lost in a merge —
  reopened as #55)
- Empty Trash requires an explicit confirmation and runs on a background
  worker. (#29)
- Dependency-leaf graph covers casks, npm, cargo, and bun, not just brew
  formulae and pip. (#13)
- Baseline header chip formatting (duplicate "ago", missing separator). (#38)
- Reverse pane navigation from Files lands on Reclaim. (#39)

## 0.1.21 - 0.1.33 (2026-06-10 - 2026-06-11)

First audit wave. Highlights:

- Search-mode selection corruption fixes (#1), spinner animation during quiet
  scans (#2), permission failures surfaced as lower-bound sizes instead of
  silent 0 B (#3), scan-result salvage and cancellation (#4), `r` rescans all
  visible directories (#5), hard-link and firmlink double-counting fixes (#6),
  removed unused mouse capture (#7), accurate brew cask (#8) and pip (#9)
  sizing, mtime display (#11), project-deps rescan caching
  (#14), TUI surfaces for reclaim/top-files/disk-details/history-diff (#15),
  file operations: rename, mkdir, multi-select, batch trash (#16), per-row
  size-share bars (#17), persistent size cache (#19).

## 0.1.0 - 0.1.20 (2026-05-01 - 2026-06-10)

Initial development: TUI file browser with `getattrlistbulk(2)` bulk scanner,
disks and packages panes, CLI reports (`--top`, `--reclaim`, `--save`/`--diff`,
`--space`, `--packages`, `--thin-snapshots`), automated release workflow.