Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1371a43
chore: bump dependencies (clap 4.6, tokio 1.52, toml 1.1, shlex 2)
nicholasjpaterno Sep 23, 2026
57cb144
refactor: manual per-project update checks, global per-dep version ca…
nicholasjpaterno Sep 23, 2026
5df984b
chore: remove the v0.3 Rust-only implementation ahead of the rewrite
nicholasjpaterno Sep 23, 2026
ca29d8e
feat(core): polyglot discovery, measurement, git safety and clean engine
nicholasjpaterno Sep 23, 2026
a8e11d2
feat(cli): scan, clean, ecosystems, history and completions
nicholasjpaterno Sep 23, 2026
9fdec3f
test(cli): end-to-end scan, clean, dry-run, confirmation and rules tests
nicholasjpaterno Sep 23, 2026
f598ec2
feat(tui): interactive reclaim view
nicholasjpaterno Sep 23, 2026
28088aa
feat: task discovery and `carwash tasks` / `carwash run`
nicholasjpaterno Sep 23, 2026
38ee097
feat(tui): Tasks tab with jobs in real terminals
nicholasjpaterno Sep 23, 2026
5adac61
feat: dependency checks across Rust, JavaScript, Python and Go
nicholasjpaterno Sep 23, 2026
734ee66
chore: update anyhow (RUSTSEC-2026-0190) and clap
nicholasjpaterno Sep 23, 2026
85b9709
feat(tui): Updates tab
nicholasjpaterno Sep 23, 2026
a2083ec
feat: global caches outside projects
nicholasjpaterno Sep 23, 2026
d9b5804
chore: drop unused dependencies, update crossbeam-epoch (RUSTSEC-2026…
nicholasjpaterno Sep 23, 2026
9267ac9
fix(tui): mouse wheel scrolls the current tab
nicholasjpaterno Sep 23, 2026
8b12fc0
fix(config): ignore configuration files written by 0.3
nicholasjpaterno Sep 23, 2026
2a5a37e
ci: lint, test on three platforms, MSRV and cargo-deny
nicholasjpaterno Sep 23, 2026
5a1d8a0
docs: README and changelog for 0.4
nicholasjpaterno Sep 23, 2026
9bac97f
feat(tui): remember cache sizes; footer with global keys and tooltips
nicholasjpaterno Sep 24, 2026
9b78131
feat(tui): scan another folder with p; fingerprinted, saved cache sizes
nicholasjpaterno Sep 24, 2026
9c5011e
chore: prepare 0.4.0
nicholasjpaterno Sep 25, 2026
316fce0
test(cli): compare paths with the platform separator
nicholasjpaterno Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 38 additions & 47 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,65 +2,56 @@ name: CI

on:
push:
branches: [ main, develop ]
branches: [main]
pull_request:
branches: [ main, develop ]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
RUSTFLAGS: -D warnings

jobs:
test:
name: Test
lint:
name: Format and Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}

- name: Cache cargo index
uses: actions/cache@v4
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}

- name: Cache target directory
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}

- name: Run tests
run: cargo test --verbose

- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings

- name: Check formatting
run: cargo fmt -- --check
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- run: cargo fmt --all -- --check
- run: cargo clippy --workspace --all-targets --locked
- run: cargo doc --workspace --no-deps --locked

build:
name: Build
test:
name: Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Build release
run: cargo build --release --verbose

- name: Run basic smoke test
run: cargo run --release -- --help
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo test --workspace --locked

msrv:
name: MSRV (1.88)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@1.88
- uses: Swatinem/rust-cache@v2
- run: cargo check --workspace --all-targets --locked

deny:
name: Advisories and licenses
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: EmbarkStudios/cargo-deny-action@v2
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@ Thumbs.db
# Development notes
*.md
!README.md
.claude/
39 changes: 39 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,45 @@ All notable changes to CarWash will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.4.0] - 2026-09-25

A rewrite. carwash is no longer a Rust project manager: it reclaims disk space across projects
in any of 40 ecosystems, and checks dependencies and runs tasks along the way. Nothing from 0.3
carries over, including the configuration file.

### Added
- Engine crate `carwash-core`, independent of the UI: parallel discovery driven by declarative
ecosystem rules, content detection (`CACHEDIR.TAG`, virtualenvs, conda, CMake and Meson build
trees, orphaned Cargo targets), workspace and enclosing-project awareness.
- Sizes from allocated blocks with hard links counted once, and a separate "reclaimable" figure
for data that deleting the artifact would actually free.
- Safety policy from git: tracked content is protected; generic names such as `build` or
`vendor` need git or content confirmation; recently modified artifacts are held back.
- Validated deletion: re-checked just before removal, renamed to a staging name, then removed in
parallel. Optional trash mode. Interrupted cleans are found and finished by the next scan.
- CLI: `scan`, `clean`, `tasks`, `run`, `outdated`, `caches`, `ecosystems`, `history`,
`completions`; `--json` on every listing.
- TUI with four tabs: Reclaim (tree, fuzzy and facet filter, review before cleaning), Tasks (jobs
in pseudo-terminals), Updates (outdated and vulnerable dependencies for Rust, JavaScript, Python
and Go, updated through each ecosystem's own tool) and Caches (per-user caches outside projects).
- Task discovery from `package.json`, `deno.json`, justfiles, Makefiles, Taskfiles, mise,
Poe/PDM, Composer and Cargo aliases, plus standard commands per ecosystem.
- 32 global caches (package stores, toolchains, Xcode and simulator data, IDE caches) with the
tool's own prune command where one exists. Sizes are remembered between runs, so the Caches
tab opens instantly; a cache is measured again when the top of its tree changes, after a
week otherwise, or on request.
- `p` scans another folder without restarting, with directory completion.
- A footer that separates the current tab's keys from those that work in any tab. Hovering a
key or tab explains it (for `d`, exactly what will be deleted or run); clicking runs it.
- Help per tab that sizes itself to the terminal.
- User-extensible rules in `ecosystems.toml` and `caches.toml`.
- Themes: gestalt (default), latte, nord, dracula, and a 16-color fallback.
- A configuration file left by 0.3 is ignored with a warning instead of stopping every command.

### Changed
- Configuration moved to `~/.config/carwash/config.toml` with a new schema.
- Minimum supported Rust version is 1.88.

## [0.3.5] - 2026-03-03

### Added
Expand Down
Loading
Loading