# Changelog
All notable changes to TCDir are documented in this file.
## [5.2.1346] - 2026-03-28
### Added
- `--set-aliases`: interactive TUI wizard for configuring PowerShell aliases
- Root alias name (1-4 chars, default `d`) with derived sub-aliases (`dt`, `dw`, `dd`, `ds`, `dsb`)
- Sub-alias checkbox selection (tree view, wide, directories-only, recursive, recursive bare)
- Profile location radio selection (4 PS profile scopes + session-only)
- Alias block preview with confirmation before writing
- Conflict detection against existing PowerShell commands/aliases
- Auto-detection of calling PowerShell version (7+ or 5.1) via parent process inspection
- AllUsers profile paths resolved from `$PSHOME` (PS install directory)
- CurrentUser profile paths resolved via `SHGetKnownFolderPath` with OneDrive KFM support
- Spinner animation during profile scanning
- Timestamped `.bak` backups before modifying profile files
- `--get-aliases`: non-interactive display of all configured tcdir aliases across profile files
- `--remove-aliases`: interactive checkbox-based removal from one or more profiles (opt-in selection)
- `--whatif`: dry-run modifier for `--set-aliases` and `--remove-aliases` (preview without file changes)
- TUI widget infrastructure: text input, checkbox list, radio button list, confirmation prompt
- Multi-line label support with blank-line separators
- In-place re-rendering via cursor movement (no screen flicker)
- RAII console mode/cursor restore on Ctrl+C or Escape
- 464 unit tests (up from 408)
### Changed
- Minor version bump from 5.1 to 5.2
## [5.1.1149] - 2026-03-05
### Fixed
- `tcdir foo` now lists contents of the `foo` subdirectory instead of treating it as a filename pattern — behavior matches `tcdir .\foo`
### Changed
- Refactored `SplitMaskIntoDirAndFileSpec` into `SplitPureMask` and `SplitQualifiedMask` helpers
- Updated winget manifest templates from schema 1.10.0 to 1.12.0
## [5.1.1106] - 2026-02-21
### Added
- `--Tree` switch: hierarchical directory tree view with Unicode box-drawing connectors (`├──`, `└──`, `│`)
- `--Depth=N` switch: limit tree recursion depth (e.g., `--Depth=2` shows two levels)
- `--TreeIndent=N` switch: configurable indent width per tree level (1–8, default 4)
- `--Size=Auto` switch: Explorer-style abbreviated file sizes (e.g., `8.90 KB`, `1.00 MB`, `2.38 GB`) with fixed 7-character width — default in tree mode
- `--Size=Bytes` switch: explicit opt-in for exact comma-separated sizes (existing default for non-tree modes)
- Tree connector color (`TreeConnector`) configurable via `TCDIR` environment variable
- TCDIR env var support for `Tree`, `Tree-`, `Depth=N`, `TreeIndent=N`, `Size=Auto`, `Size=Bytes`
- Thread-safe empty subdirectory pruning when file masks are active (producer-side upward propagation via parent back-pointers and condition variables)
- Reparse-point cycle guard: junction/symlink directories are listed but not expanded, preventing infinite loops in both `-S` and `--Tree` modes
- Interleaved sort in tree mode: directories and files sorted together (not grouped)
- Per-directory summary at each tree level plus grand total at end
- Comprehensive test suite: 408 tests covering tree connectors, depth limiting, pruning, streams, icons, reparse points, and column alignment
### Changed
- Minor version bump from 5.0 to 5.1
- Column spacing adjustment: added 1 space between attributes and size column, reduced gap between size and icon from 3 to 2
- `
` shifted left within its field for better visual alignment with abbreviated sizes
### Incompatibilities
- `--Tree` cannot be combined with `-W` (wide), `-B` (bare), `-S` (recurse), or `--Owner`
- `--Size=Bytes` cannot be used with `--Tree` (tree mode requires fixed-width sizes)
- `--Depth` and `--TreeIndent` require `--Tree`
## [5.0.1038] - 2026-02-15
### Added
- Nerd Font file and folder icons in directory listings (normal, wide, and bare modes)
- ~200 file extension icon mappings aligned with Terminal-Icons default theme
- ~65 well-known directory icon mappings (Terminal-Icons aligned with 5 intentional deviations)
- Auto-detection of Nerd Font availability via GDI glyph canary probe and system font enumeration
- WezTerm auto-detection (bundles Nerd Font symbols natively)
- ConPTY terminal detection (Windows Terminal, VS Code, etc.)
- `/Icons` and `/Icons-` CLI switches for manual icon override
- `TCDIR=Icons` / `TCDIR=Icons-` env var switch for persistent icon preference
- `TCDIR=.ext=Color,U+XXXX` icon override syntax for per-extension custom icons
- Cloud status Nerd Font glyph upgrade (☁/✓/📌 → nf-md glyphs when NF available)
- Icon display in `/config` and `/env` diagnostics
- Rust language support (.rs, .toml, .cargo)
- IconMapping module (IconMapping.h/cpp) with compile-time sorted lookup tables
- NerdFontDetector module (NerdFontDetector.h/cpp) with GDI and heuristic detection
- Comprehensive icon tests: mapping lookups, NF detection, display integration (307 total tests)
### Changed
- Major version bump from 4.x to 5.0
### Fixed
- Nerd Font suffix detection now matches abbreviated suffixes (NF, NFM, NFP)
## [4.2.1436] - 2026-02-13
### Fixed
- TCDIR env var: entries with invalid background color (e.g., `Chartreuse`) now reject the entire entry instead of falling back to black-on-black
- TCDIR env var: entries where foreground and background are the same color (e.g., `Blue on Blue`) are now rejected as unreadable
- `--config` now shows validation errors after the configuration table, matching `--env` convention
- Foreground colors matching the terminal background are now auto-corrected with a contrasting background in all display paths (listing, `--config`, `--env`)
## [4.2.1414] - 2026-02-05
### Changed
- Multi-mask processing: masks targeting the same directory are now grouped and processed together with deduplication
- Directory counts (both per-directory and grand total) now reflect subdirectories whose names match the pattern, not all traversed directories
- CDirectoryInfo simplified with in-class member initializers
### Added
- Comprehensive directory count and mask matching tests
## [4.2.1322] - 2026-02-01
### Fixed
- TCDIR env var error message now uses correct switch prefix (`--env` vs `/env`) based on user's choice
- TCDIR env var error "see --env for help" hint no longer shown when already viewing `--env` output
## [4.2.1318] - 2026-02-01
### Changed
- Refactored console output to use `ColorPrintf`/`ColorPuts` with embedded color markers (`{EAttributeName}`)
- `--env` help text now uses `{Information}`/`{InformationHighlight}` colors consistently with `-?` output
- Wide listing: `GetWideFormattedName` now returns `wstring_view` with caller-provided stack buffer (thread-safe)
- Cloud status display refactored to use lookup table instead of switch statement
### Fixed
- `ColorPrintf` no longer appends trailing newline (use `ColorPuts` for that)
## [4.2.1284] - 2026-01-31
### Added
- Colorized help output: `/? ` now displays switches, attribute letters, and cloud status symbols in color
## [4.2.1195] - 2026-01-29
### Fixed
- Cloud status symbols no longer appear for files outside cloud sync roots (e.g., files copied from OneDrive that retained stale attributes)
- IncrementVersion.ps1: Add robustness with atomic writes, retry logic, and auto-recovery from git for corrupted Version.h
## [4.2] - 2026-01-28
### Added
- Cloud file visualization: ○/◐/● symbols show sync status for OneDrive, iCloud, etc.
- Cloud attribute filters: `/A:O` (cloud-only), `/A:L` (local), `/A:V` (pinned/always available)
- Extended attribute filters: `/A:X` (not indexed), `/A:I` (integrity), `/A:B` (no scrub), `/A:F` (sparse), `/A:U` (unpinned)
- `/T:` switch to select time field for display and sorting (Creation, Access, Write)
- `--owner` switch to display file ownership (DOMAIN\User)
- `--streams` switch to display NTFS alternate data streams
- `--debug` switch for raw hex attribute display (debug builds only)
- Decoded settings display in `--env` output
### Changed
- TCDIR env var: switch names no longer require prefix (`W` instead of `-W`)
## [4.1] - 2026-01-15
### Added
- `/B` switch for bare listing format (filenames only, no headers/footers)
- Seamless support for `-` or `/` switch prefix (reflects user's choice in help)
## [4.0] - 2026-01-16
### Added
- Multi-threaded directory enumeration (`/M`, enabled by default)
- ARM64 native support
- `--env` switch to display TCDIR environment variable help and current value
- `--config` switch to display current color configuration
- TCDIR env var: support for default switches (W, S, P, M)
- TCDIR env var: file attribute color overrides (`Attr:H=DarkGrey`)
- Structured error reporting with visual underlining for TCDIR parsing errors
### Changed
- Split configuration display from env var help (`--env` vs `--config`)
## [3.x] - 2020-2025
### Added
- `/P` switch to display performance timing
- Unit test framework
- TCDIR environment variable for color customization
### Changed
- Upgraded to C++latest (/std:c++latest)
- Refactored to use std::filesystem
- Project restructured: TCDirCore library + TCDir executable
## [2.x] - 2020
Modernization of the classic TCDir codebase.
## [1.x] - 1990s
Initial versions, inspired by ZDir
---
*For the complete commit history, see the [GitHub repository](https://github.com/relmer/TCDir).*