Releases: mneves75/devtrim
Releases · mneves75/devtrim
Release list
devtrim 0.8.2
Immutable
release. Only release title and notes can be modified.
Changed
devtrim scannow runs its nine category scanners concurrently instead of one after another, so the independent external programs each category waits on (npm,brew,xcrun,docker,pgrep,lsof,git) overlap rather than queue. Results are joined in registry order, so the JSON document is byte-identical to the serial version: over a 25-repository corpus the parallel binary and the previous serial binary produce the same SHA-256, and twelve consecutive parallel runs produce that one digest. Cross-category diagnostic lines now appear in arrival order rather than registry order; findings, errors, and the single-document guarantee are unaffectedOpnow has exactly one scan entry point, taking the per-scan observations explicitly. The previous optional second method could be left unimplemented by a new category, which would silently reprobe instead of sharing the scan's observations
Fixed
- Removed duplicated and vacuous test code: two
node_modulesapply tests whose shapes the authority table already covers, a Git fixture duplicated byte-for-byte across two modules, five forged-authority tests collapsed into two table-driven ones, a docker stub pasted three times, and four assertions that restated their own setup or re-derived the value under test. The unit suite runs in roughly half the wall time it did - The
node_modulesauthority table now asserts the refusal reason for non-normal path spellings rather than only that some refusal occurred
Security
- Added an adversarial concurrency regression test: a mutator thread races the deletion sink, repeatedly swapping the target with a symbolic link to a bystander file while the sink runs. Across sixty loaded runs the sink never destroyed the bystander. The test carries a deterministic control deletion first, so an all-refusals outcome cannot be mistaken for success
- Restored explicit assertions that the home directory root and the Trash root are protected. Both share one branch of the protected-path check that no remaining test covered after the test cleanup; a deliberately broken branch now fails the suite
- Restored coverage for a forged actionable finding carrying no path at all, in both the Docker and simulator authority tables
devtrim 0.8.2-beta1
Immutable
release. Only release title and notes can be modified.
Changed
devtrim scannow runs its nine category scanners concurrently instead of one after another, so the independent external programs each category waits on (npm,brew,xcrun,docker,pgrep,lsof,git) overlap rather than queue. Results are joined in registry order, so the JSON document is byte-identical to the serial version: over a 25-repository corpus the parallel binary and the previous serial binary produce the same SHA-256, and twelve consecutive parallel runs produce that one digest. Cross-category diagnostic lines now appear in arrival order rather than registry order; findings, errors, and the single-document guarantee are unaffectedOpnow has exactly one scan entry point, taking the per-scan observations explicitly. The previous optional second method could be left unimplemented by a new category, which would silently reprobe instead of sharing the scan's observations
Fixed
- Removed duplicated and vacuous test code: two
node_modulesapply tests whose shapes the authority table already covers, a Git fixture duplicated byte-for-byte across two modules, five forged-authority tests collapsed into two table-driven ones, a docker stub pasted three times, and four assertions that restated their own setup or re-derived the value under test. The unit suite runs in roughly half the wall time it did - The
node_modulesauthority table now asserts the refusal reason for non-normal path spellings rather than only that some refusal occurred
Security
- Added an adversarial concurrency regression test: a mutator thread races the deletion sink, repeatedly swapping the target with a symbolic link to a bystander file while the sink runs. Across sixty loaded runs the sink never destroyed the bystander. The test carries a deterministic control deletion first, so an all-refusals outcome cannot be mistaken for success
- Restored explicit assertions that the home directory root and the Trash root are protected. Both share one branch of the protected-path check that no remaining test covered after the test cleanup; a deliberately broken branch now fails the suite
- Restored coverage for a forged actionable finding carrying no path at all, in both the Docker and simulator authority tables
devtrim 0.8.1
Immutable
release. Only release title and notes can be modified.
Security
- Limit Hugging Face cleanup to
~/.cache/huggingface/hub, preserving authentication tokens and other parent state; scanner and apply reject the parent as cleanup authority - Pin Rust 1.98.1 to avoid the 1.98.0 vtable-generation miscompilation; MSRV remains 1.88.0
Changed
- Share successful and failed build-process and Git observations across one scan, keeping fresh checks at apply; reuse installer eligibility metadata within a scan
- Redraw analyze and status dashboards only when visible state changes, and format only the visible analyze rows
- Consolidate subprocess parsing, category dispatch, removal notes, root normalization, and popup geometry; remove redundant forwarding code and unused video scaffolding/dependencies
- Add isolated PTY verification, an explicit local verification helper, and a controlled A/B benchmark harness that rejects failed or unequal scans and overloaded-host timing
- Refresh shared agent instructions, verification and worktree guidance, and compiler/shell/terminal checks in CI and release workflows
Fixed
- Preserve the
installersoperation name in JSON command-line parsing errors - Refresh the demo version, installer menu entry, Hugging Face target, and size-escalated danger scores
devtrim 0.8.1-beta1
Immutable
release. Only release title and notes can be modified.
Security
- Limit Hugging Face cleanup to
~/.cache/huggingface/hub, preserving authentication tokens and other parent state; scanner and apply reject the parent as cleanup authority - Pin Rust 1.98.1 to avoid the 1.98.0 vtable-generation miscompilation; MSRV remains 1.88.0
Changed
- Share successful and failed build-process and Git observations across one scan, keeping fresh checks at apply; reuse installer eligibility metadata within a scan
- Redraw analyze and status dashboards only when visible state changes, and format only the visible analyze rows
- Consolidate subprocess parsing, category dispatch, removal notes, root normalization, and popup geometry; remove redundant forwarding code and unused video scaffolding/dependencies
- Add isolated PTY verification, an explicit local verification helper, and a controlled A/B benchmark harness that rejects failed or unequal scans and overloaded-host timing
- Refresh shared agent instructions, verification and worktree guidance, and compiler/shell/terminal checks in CI and release workflows
Fixed
- Preserve the
installersoperation name in JSON command-line parsing errors - Refresh the demo version, installer menu entry, Hugging Face target, and size-escalated danger scores
devtrim 0.8.0-beta1
Immutable
release. Only release title and notes can be modified.
Security
- The demo-video dependency graph moves
fast-urifrom 3.1.5 to 3.1.6, clearing four high-severity advisories (host confusion via skipped IDN canonicalization and via percent-encoded scheme normalization, plus SSRF via malformed IPv6 normalization and via repeated hostname percent-decoding). It reaches the tree four levels down, through@remotion/clitowebpacktoschema-utilstoajv, and does not enter the shipped binary — but the video graph is a release gate, so the advisory blocked the release until fixed
Added
devtrim optimizeruns macOS maintenance tasks as typed commands with fixed argv and no caller-supplied data: QuickLook thumbnail cache, user font caches, and the Launch Services database.--applyrequires an explicit--task, becauseplan_dangertakes the maximum and one confirmation must not authorize unrelated work. A task that cannot do what its name says is not offered: root-requiring or hours-long ones, and DNS, becausedscacheutil -flushcachedoes not clear themDNSResponderresolver cache it would advertisedevtrim status --watchis a live dashboard: sampling runs on a worker thread and the interface redraws when a report lands, so a slow probe delays the numbers rather than the keyboard. Every metric keeps a fixed row slot and an unreadable one renders asunavailable, so a number never moves because a probe failed once. Quitting does not join the sampler: the stop flag is only observed between samples, so joining would makeqwait out an in-flight probe and a hung system command would block the exit entirely. It has no JSON form and says so instead of ignoring the flagdevtrim uninstall <app>lists the paths macOS keys by an application's exact bundle identifier, read from the bundle's ownInfo.plist: support directories, caches, containers, preferences, saved state, HTTP storages, WebKit data, and launch agents. Matching is exact —com.example.thingnever selectscom.example.thingy, and a display name never selects by word — which is why it works at all: Amazon Kindle iscom.amazon.Lassen. It is a conservative report rather than an inventory, and says so: an app storing data under a product name is invisible to identifier matching, and group containers are omitted because their names come from an arbitrary entitlement. Report-only, becausesafety::is_protectedrefuses/Applicationsand everything under~/Libraryoutside a four-entry allowlist, and widening that would weaken every command rather than only this one
devtrim 0.7.0
Immutable
release. Only release title and notes can be modified.
Added
devtrim statusreports read-only machine vitals — uptime, load, memory, disk, battery, thermals, cumulative network, busiest processes — and a health score that names every input it could not read instead of scoring over the gap. Each value comes from a fixed-argv system tool through a parser that fails closed on malformed input. Disk is measured on the writable Data volume rather than the sealed root, becausedf /reports a nearly full machine as 17% used; memory used is stated asactive + wired + compressed, because counting reclaimable inactive pages reports a healthy machine at 96%devtrim analyze [path]is an interactive, read-only disk explorer: it measures each child on a worker thread and streams results in as they land, so a directory that takes minutes to size never freezes the interface, and leaving a directory cancels its in-flight walk. Symbolic links are reported at their own size rather than followed, a different device is never entered, and unreadable entries are disclosed as(partial)lower bounds.--jsonemits one document; every mutation flag is rejected- The terminal interface honors
NO_COLOR, degrading every style to a modifier that preserves the same distinction — the danger ladder stays ordered as dim, plain, bold, bold+reversed — so the interface remains usable with color stripped entirely ?opens a full keybinding reference over any screen, deliberately except the confirmation prompt, where a second overlay would obscure the plan being approved; the footer keeps only the few keys that apply to the current screenclean installersreclaims downloaded installer archives (dmg,pkg,mpkg,iso,xip) left as direct children ofDownloadsandDesktopafter the configured active window, refusing symlinks, nested copies inside extracted project trees, and any target outside those two directories at apply time
Changed
- Terminal styling moved from 30 inline color literals to semantic tokens in
src/theme.rs, so call sites name what a span means and one module decides how it looks; colors remain named ANSI rather than RGB so they keep resolving through the user's own terminal theme - Every tracked
*.shplus the pre-commit hook now passshellcheckbefore local commits and in CI through one fail-closed, NUL-safe helper; CI installs the official ShellCheck 0.11.0 arm64 asset only after checksum verification - CI and non-Intel release jobs move from the deprecated
macos-14image to the supportedmacos-15arm64 image with exact runner-policy checks; the deterministic x86 release gate remains onmacos-15-intel - Ordinary PR/main CI now installs checksum-verified arm64 Gitleaks 8.30.1 and TruffleHog 3.97.1, proves Gitleaks detects a non-allowlisted synthetic PAT, then runs the same full-history secret scans that release gates already run
Fixed
clean dockerunder-reported reclaimable space by roughly 7x becausedocker system dfmeasures only inside the guest: the host-side OrbStack/Docker Desktop VM disk image is now disclosed as a report-only finding measured in allocated blocks, with a note stating that pruning frees guest space but never shrinks that sparse file until the runtime compacts it- The Docker VM disk image is now reported even when the daemon is not running, which is the one state where it is invisible to
dockerand still occupying the host; a refused remote endpoint and a malformeddockerresponse remain hard errors - Artifact scanning and apply now both refuse targets below every ASCII-case variant of
node_modules, closing the sibling dependency-namespace deletion path with an end-to-end surviving-sentinel regression trash-emptynow warns and leaves a direct.gitcase variant in place without letting that protected item block other exact previewed Trash children- Permanent and Trash preflight reuse each directory listing for Git-marker checks instead of enumerating every directory twice, while retaining the final mutation-time recheck
- Git-backed unit fixtures now disable ambient commit signing and hooks, so maintainer Git configuration cannot make the Rust suite fail
- Release policy now proves the Gitleaks positive control runs before the scanner directory reaches
PATH, and both workflows syntax-check that control script explicitly node-modulesapply now reasserts the scanner's exact target shape before deletion, refusing non-directory and symlink targets, symlinked category ancestors, forged non-node_modulesleaves, plus ASCII-case-insensitive.gitand outernode_modulesancestors and non-normal paths- The landing page and packaged manual now declare a compact project favicon instead of generating a browser-level
/favicon.ico404 on every fresh visit - The landing-page hero caption now keeps readable contrast over every part of its image instead of combining muted text with a translucent overlay
- The ShellCheck helper now fails before linting with an actionable error when
shellcheckis unavailable, and release policy proves that path does not invoke ShellCheck CODING_STANDARDS.mdno longer tells review to skip gates that run only at release (cmp -s AGENTS.md CLAUDE.md, the fuzz targets,actionlint), and now lists thevideo/, shell, and secret-scanning merge gates it had omitted, so a reviewer no longer spends the budget on checks that already blockCODING_STANDARDS.mdcorrects an S1 precedent that no search could find, S12's incomplete list of approved dynamic call sites, S6's unstated denylist, and the ast-grep escape hatches sanctioned by the deletion-sink rule- The binary entry point now carries the
//!module contract that S4 requires of every file undersrc/
Security
- Git metadata is now denied ASCII-case-insensitively by project scanners, ownership and category checks, target validation, and open-handle Trash/permanent preflight, closing actionable
.GITfindings on case-insensitive macOS filesystems - Common local environment, private-key, and signing-material files are ignored, while checksum-pinned full-history Gitleaks and TruffleHog scans now block ordinary PR/main CI as well as releases
- CI and release refuse a Gitleaks binary that cannot trip a runtime positive control, so a version string and clean scan cannot mask a no-op detector
devtrim 0.7.0-beta2
Immutable
release. Only release title and notes can be modified.
Added
devtrim statusreports read-only machine vitals — uptime, load, memory, disk, battery, thermals, cumulative network, busiest processes — and a health score that names every input it could not read instead of scoring over the gap. Each value comes from a fixed-argv system tool through a parser that fails closed on malformed input. Disk is measured on the writable Data volume rather than the sealed root, becausedf /reports a nearly full machine as 17% used; memory used is stated asactive + wired + compressed, because counting reclaimable inactive pages reports a healthy machine at 96%devtrim analyze [path]is an interactive, read-only disk explorer: it measures each child on a worker thread and streams results in as they land, so a directory that takes minutes to size never freezes the interface, and leaving a directory cancels its in-flight walk. Symbolic links are reported at their own size rather than followed, a different device is never entered, and unreadable entries are disclosed as(partial)lower bounds.--jsonemits one document; every mutation flag is rejected- The terminal interface honors
NO_COLOR, degrading every style to a modifier that preserves the same distinction — the danger ladder stays ordered as dim, plain, bold, bold+reversed — so the interface remains usable with color stripped entirely ?opens a full keybinding reference over any screen, deliberately except the confirmation prompt, where a second overlay would obscure the plan being approved; the footer keeps only the few keys that apply to the current screenclean installersreclaims downloaded installer archives (dmg,pkg,mpkg,iso,xip) left as direct children ofDownloadsandDesktopafter the configured active window, refusing symlinks, nested copies inside extracted project trees, and any target outside those two directories at apply time
Changed
- Terminal styling moved from 30 inline color literals to semantic tokens in
src/theme.rs, so call sites name what a span means and one module decides how it looks; colors remain named ANSI rather than RGB so they keep resolving through the user's own terminal theme - Every tracked
*.shplus the pre-commit hook now passshellcheckbefore local commits and in CI through one fail-closed, NUL-safe helper; CI installs the official ShellCheck 0.11.0 arm64 asset only after checksum verification - CI and non-Intel release jobs move from the deprecated
macos-14image to the supportedmacos-15arm64 image with exact runner-policy checks; the deterministic x86 release gate remains onmacos-15-intel - Ordinary PR/main CI now installs checksum-verified arm64 Gitleaks 8.30.1 and TruffleHog 3.97.1, proves Gitleaks detects a non-allowlisted synthetic PAT, then runs the same full-history secret scans that release gates already run
Fixed
clean dockerunder-reported reclaimable space by roughly 7x becausedocker system dfmeasures only inside the guest: the host-side OrbStack/Docker Desktop VM disk image is now disclosed as a report-only finding measured in allocated blocks, with a note stating that pruning frees guest space but never shrinks that sparse file until the runtime compacts it- The Docker VM disk image is now reported even when the daemon is not running, which is the one state where it is invisible to
dockerand still occupying the host; a refused remote endpoint and a malformeddockerresponse remain hard errors - Artifact scanning and apply now both refuse targets below every ASCII-case variant of
node_modules, closing the sibling dependency-namespace deletion path with an end-to-end surviving-sentinel regression trash-emptynow warns and leaves a direct.gitcase variant in place without letting that protected item block other exact previewed Trash children- Permanent and Trash preflight reuse each directory listing for Git-marker checks instead of enumerating every directory twice, while retaining the final mutation-time recheck
- Git-backed unit fixtures now disable ambient commit signing and hooks, so maintainer Git configuration cannot make the Rust suite fail
- Release policy now proves the Gitleaks positive control runs before the scanner directory reaches
PATH, and both workflows syntax-check that control script explicitly node-modulesapply now reasserts the scanner's exact target shape before deletion, refusing non-directory and symlink targets, symlinked category ancestors, forged non-node_modulesleaves, plus ASCII-case-insensitive.gitand outernode_modulesancestors and non-normal paths- The landing page and packaged manual now declare a compact project favicon instead of generating a browser-level
/favicon.ico404 on every fresh visit - The landing-page hero caption now keeps readable contrast over every part of its image instead of combining muted text with a translucent overlay
- The ShellCheck helper now fails before linting with an actionable error when
shellcheckis unavailable, and release policy proves that path does not invoke ShellCheck CODING_STANDARDS.mdno longer tells review to skip gates that run only at release (cmp -s AGENTS.md CLAUDE.md, the fuzz targets,actionlint), and now lists thevideo/, shell, and secret-scanning merge gates it had omitted, so a reviewer no longer spends the budget on checks that already blockCODING_STANDARDS.mdcorrects an S1 precedent that no search could find, S12's incomplete list of approved dynamic call sites, S6's unstated denylist, and the ast-grep escape hatches sanctioned by the deletion-sink rule- The binary entry point now carries the
//!module contract that S4 requires of every file undersrc/
Security
- Git metadata is now denied ASCII-case-insensitively by project scanners, ownership and category checks, target validation, and open-handle Trash/permanent preflight, closing actionable
.GITfindings on case-insensitive macOS filesystems - Common local environment, private-key, and signing-material files are ignored, while checksum-pinned full-history Gitleaks and TruffleHog scans now block ordinary PR/main CI as well as releases
- CI and release refuse a Gitleaks binary that cannot trip a runtime positive control, so a version string and clean scan cannot mask a no-op detector
devtrim 0.6.3
Immutable
release. Only release title and notes can be modified.
Changed
- Global mutation flags are now capability-scoped: report-only commands reject flags they cannot honor, while
scan --shredand Trash purge retain only their meaningful controls - Docker and simulator cleanup now reject
--shredinstead of accepting a flag that cannot affect their exact typed command actions - Release version validation now checks the authoritative changelog heading and exact, unique README and manual version declarations instead of accepting substring matches
Fixed
- The TUI now filters configured protected Trash items before it calculates danger or asks for approval
- Bare
devtrim --jsonnow rejects the implicit TUI before terminal launch, matching explicitdevtrim tui --jsonand preserving automation-only JSON behavior - A present but missing, broken, escaping, or otherwise invalid
swift-latest.xctoolchainreference now blocks toolchain cleanup instead of producing an empty successful scan - The production landing page now points to the actual stable v0.6.2 archive and release while the v0.6.3 candidate is in beta staging
Security
- Human command previews escape the complete action string, closing terminal control-character injection through dynamic but validated command arguments without altering JSON data
- Xcode and Swift toolchain apply now reassert each scanner's exact direct-child target shape before the shared deletion sink, so a forged nested finding cannot borrow the category's authority
- Release verification passed current and MSRV suites, strict Clippy, structural positive controls, root and fuzz dependency audits, all five 60-second fuzz targets, the arm64 build, PTY cancellation, workflow/shell/secret gates, P3 autoreview, Matt Pocock standards/spec review, video build/render/container checks, desktop/mobile browser checks, and a fresh independent verifier
devtrim 0.6.3-beta1
Immutable
release. Only release title and notes can be modified.
Changed
- Global mutation flags are now capability-scoped: report-only commands reject flags they cannot honor, while
scan --shredand Trash purge retain only their meaningful controls - Docker and simulator cleanup now reject
--shredinstead of accepting a flag that cannot affect their exact typed command actions - Release version validation now checks the authoritative changelog heading and exact, unique README and manual version declarations instead of accepting substring matches
Fixed
- The TUI now filters configured protected Trash items before it calculates danger or asks for approval
- Bare
devtrim --jsonnow rejects the implicit TUI before terminal launch, matching explicitdevtrim tui --jsonand preserving automation-only JSON behavior - A present but missing, broken, escaping, or otherwise invalid
swift-latest.xctoolchainreference now blocks toolchain cleanup instead of producing an empty successful scan - The production landing page now points to the actual stable v0.6.2 archive and release while the v0.6.3 candidate is in beta staging
Security
- Human command previews escape the complete action string, closing terminal control-character injection through dynamic but validated command arguments without altering JSON data
- Xcode and Swift toolchain apply now reassert each scanner's exact direct-child target shape before the shared deletion sink, so a forged nested finding cannot borrow the category's authority
- Release verification passed current and MSRV suites, strict Clippy, structural positive controls, root and fuzz dependency audits, all five 60-second fuzz targets, the arm64 build, PTY cancellation, workflow/shell/secret gates, P3 autoreview, Matt Pocock standards/spec review, video build/render/container checks, desktop/mobile browser checks, and a fresh independent verifier
devtrim 0.6.2
Immutable
release. Only release title and notes can be modified.
Changed
- Production release closeout now re-verifies the immutable artifact, updates and audits the Homebrew tap, upgrades the maintainer installation, and proves the sole
/opt/homebrew/bin/devtrimreports the released version - The crate now forbids
unsafeand deniesunwrap/expect/panic/unreachable/todo/unimplemented/dbg!and unreasoned lint suppression outside tests, and structural lints with positive-control tests now cover shell invocation and binding names alongside the deletion sink CODING_STANDARDS.mddocuments the review-time rules that tooling cannot check, as citableS<n>entries
Fixed
- Filesystem size and artifact/toolchain evidence checks now treat metadata errors as blocking failures instead of silently reporting an absent or empty path
- Build-process liveness checks now reject every nonzero
lsofresult afterpgrepfinds candidate processes instead of treating an uncertain probe as no activity
Security
- Docker cleanup rejects remote contexts, previews the exact absolute local Unix-socket endpoint, and pins that endpoint into the typed command authority used by apply
- Simulator cleanup previews and authorizes one validated UDID per finding, then rechecks that exact device is still unavailable before deletion
- Trash-mode directory cleanup now rejects foreign filesystem devices and nested Git repository/worktree markers before the path-based Trash call, matching the permanent-deletion preflight
- Release verification passed the full and MSRV test suites, strict Clippy, structural controls and positive controls, dependency audits, five 60-second fuzz targets, the arm64 build, PTY TUI cancellation, workflow and shell policy checks, secret scans, P3 autoreview, video build and render, and desktop/mobile layout and accessibility checks