Releases: zspatter/mod-sweep
Releases · zspatter/mod-sweep
Release list
v0.2.2
Fixed
- The GUI no longer exits silently when an action hits a configuration
error (for example a quarantine dir inside the downloads dir); failures
now land in the status bar and Log like any other error. - Name-only sources (
[NoDelete]additions) are credited on hash-verified
files, so the claims table'suniquecolumn truthfully shows what
retiring a list would free. - CRC32 rescues additionally require a size match, removing the chance of
a random 32-bit collision protecting an unrelated file. - Duplicate list labels with differing content (two same-named MO2
installs) are announced instead of silently dropping the second copy. - GUI actions refuse early with a clear message when no downloads
directory is configured yet.
Changed
- Reports bulk-load the hash cache: one query instead of one per file.
- The GUI's Hash Candidates hashes and refreshes the report in a single
pass over the disk instead of two. - Hashing pipelines reads with computation; access stays strictly
sequential, so spinning disks see no extra seeking. - The hash cache uses SQLite WAL mode: no per-file fsync, and concurrent
readers no longer block the writer. - Standalone executables are onedir bundles (one folder, both executables,
shared runtime), which trip far fewer antivirus heuristics than the
previous self-extracting stubs. - Every subcommand accepts
--log-level(restore,purge,
update-manifests, andcheck-updatepreviously lacked it). hash --limit 0now means "hash nothing" instead of "no limit".- CSV export orders rows by the same status ranking the report displays.
Added
- In-depth documentation: docs/usage.md covers every
command and config key, docs/gui.md tours the desktop
app; the README slimmed to an overview. - A tracked modsweep.example.toml template (the
personalmodsweep.tomlis no longer tracked). py.typed: the package advertises its inline type annotations to type
checkers.
Internal
- The GUI module became a package (texts / icons / workers / editor /
window). - ruff and pyright run in CI; the suite grew to 241 tests at 98% branch
coverage, including property-based invariants for version ordering and
the matcher contract, and much deeper end-to-end and GUI coverage.
Full changelog: https://github.com/zspatter/mod-sweep/blob/main/CHANGELOG.md
Note: the windows-gui / windows-cli single-file zips and the linux.zip were added after the initial release (the tagged workflow predates them; from v0.2.3 CI builds all of them directly). The Windows pair was built from the v0.2.2 tag source; the linux.zip is a repack of the CI-built linux.tar.gz with permissions preserved - identical binaries, NexusMods-compatible container.
v0.2.1
Mod Sweep v0.2.1 Metadata, documentation, and a Nolvus fix: PyPI description (README render), project urls, keywords, author; GUI screenshots; NexusMods page copy and maintenance guide; nested Nolvus instances (Instances/<name>/MODS wrapped layout) are now found, protecting their [NoDelete] custom additions.
v0.2.0
Mod Sweep v0.2.0 - first published release Whitelist-driven cleanup for shared Skyrim modlist archive directories. MIT licensed. Available on PyPI (uv tool install modsweep / pipx install modsweep) and as standalone executables below. - Sources of truth: Wabbajack (.wabbajack, exact size + xxHash64), bundled Nolvus InstallPackage manifests (CRC32, updatable in-app from this repository), MO2 [NoDelete] custom additions, whole-install recovery, snapshots. - Resolution: active-by-default, exclude globs, latest-only version filtering keyed on machine ids with explicit-entry pinning, drift detection, every decision announced. - Safety: name/size classification with a hash gate before anything moves; quarantine-first sweeps with restore; purge as the only hard delete; per-file operations. - Interfaces: full CLI and a PySide6 GUI (system-themed, sortable tables, version-grouped source tree, config editor, update checks) over one pipeline. Sub-second warm resolution via manifest cache. - 169 tests, ~95% coverage; CI on Windows/Linux/macOS/Debian/Arch.