Production-hardened Rote Play that audits dormant developer workspaces and calculates safe, reclaimable dependency and build cache space across Node, Rust, Python, Go, and Docker.
Developer environments quietly accumulate tens of gigabytes of obsolete build artifacts in projects that haven't been touched in months. Most cleanup scripts either run destructive one-liners without auditing or crash when scanning dense directories.
dev-storage-reclaimer runs a deterministic, 3-stage Directed Acyclic Graph (DAG) pipeline that discovers dormant repositories based on configurable inactivity thresholds (stale_days), inspects dependency and container caches, and renders an actionable Markdown audit table—100% read-only, with zero file mutations.
- Path-Depth Invariant Serialization: Avoids repeating deep absolute paths across serialized steps. Discovery records emit strictly relative paths (
relative_path), reducing payload size to ~22 KB for 300 completely dormant projects (~74 bytes/record). This scales the safe execution ceiling past 880+ repositories under Rote's strict 64 KB stdout DAG limit. - Nested Project Boundary Isolation: Prevents double-counting and false cache attribution when sub-projects are nested within parent directories (e.g., monorepos, microservices, or embedded repos). Build artifacts inside child folders are strictly scoped to the child project.
- Zero-Risk & Non-Destructive: Performs read-only scans and disk size measurements. Never deletes or mutates directories without explicit operator intervention.
- Hermetic Synthetic Demo: Ships with an isolated
demo=truetest runner that populates mock project trees, validates discovery and sizing, and guarantees complete sandbox cleanup after execution.
| Ecosystem | Detected Markers | Audited Directories / Artifacts |
|---|---|---|
| Node.js | package.json |
node_modules |
| Rust | Cargo.toml |
target/ |
| Python | requirements.txt, pyproject.toml, Pipfile |
.venv/, venv/, __pycache__/ |
| Docker | Engine Socket / CLI | Dangling build cache & unused image layers |
Runs an isolated, self-cleaning synthetic test tree with zero side effects:
rote play run https://play.modiqo.ai/anvit/dev-storage-reclaimer@0.4.0 demo=true --yes
Scan your local projects folder for projects inactive for more than 30 days (default):
rote play run https://play.modiqo.ai/anvit/dev-storage-reclaimer@0.4.0 root=/Users/yourname/dev --yes
Target deeply abandoned repositories inactive for 90+ days:
rote play run https://play.modiqo.ai/anvit/dev-storage-reclaimer@0.4.0 root=/Users/yourname/dev stale_days=90 --yes
┌─────────────────────────┐
│ discover_projects │ Recursive traversal, root-relative path emission,
└────────────┬────────────┘ and dormancy classification based on mtime.
│
▼
┌─────────────────────────┐
│ inspect_reclaimable │ On-demand absolute path re-joining, nested boundary
└────────────┬────────────┘ isolation, and dependency/docker cache sizing.
│
▼
┌─────────────────────────┐
│ render_markdown_report │ Emits clean, structured terminal tables and summary
└─────────────────────────┘ metrics of safe reclaimable gigabytes.
| Parameter | Type | Default | Description |
|---|---|---|---|
root |
string |
(cwd) | Absolute path to the workspace root directory. Relative paths (.) are rejected for sandbox safety. |
stale_days |
number |
30 |
Number of elapsed days since last project activity to consider a repository dormant. |
demo |
boolean |
false |
When true, provisions a temporary mocked multi-project structure and automatically prunes it upon completion. |
-
Linter Status: Passed with
0violations (rote play lint --json). -
Stdout Buffer Scalability: Tested under a 120-character nested path with 300 dormant repos:
-
Raw schema:
158,759 bytes(Failed DAG threshold) -
Path-depth invariant schema:
22,183 bytes(67% reduction; well below 65,536-byte limit) -
Boundary Validation: Verified non-overlapping disk allocation across parent/child monorepo layouts under peer audit.
- Modiqo Registry: play.modiqo.ai/anvit/dev-storage-reclaimer@0.4.0
- Source Repository: github.com/AnvitDevadiga/dev-storage-reclaimer