Add disk space cleanup skill
This commit is contained in:
165
dotfiles/agents/skills/disk-space-cleanup/SKILL.md
Normal file
165
dotfiles/agents/skills/disk-space-cleanup/SKILL.md
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
---
|
||||||
|
name: disk-space-cleanup
|
||||||
|
description: Investigate and safely reclaim disk space on this machine, especially on NixOS systems with heavy Nix, Rust/Haskell, Docker, and Podman usage. Use when disk is low, builds fail with no-space errors, /nix/store appears unexpectedly large, or the user asks for easy cleanup wins without deleting important data.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Disk Space Cleanup
|
||||||
|
|
||||||
|
Reclaim disk space with a safety-first workflow: investigate first, run obvious low-risk cleanup wins, then do targeted analysis for larger opportunities.
|
||||||
|
|
||||||
|
## Execution Default
|
||||||
|
|
||||||
|
- Start with non-destructive investigation and quick sizing.
|
||||||
|
- Prioritize easy wins first (`nix-collect-garbage`, container prune, Cargo artifacts).
|
||||||
|
- Propose destructive actions with expected impact before running them.
|
||||||
|
- Run destructive actions only after confirmation, unless the user explicitly requests immediate execution of obvious wins.
|
||||||
|
- Capture new reusable findings by updating this skill before finishing.
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
1. Establish current pressure and biggest filesystems
|
||||||
|
2. Run easy cleanup wins
|
||||||
|
3. Sweep Rust build artifacts in common project roots
|
||||||
|
4. Investigate remaining heavy directories with `ncdu`/`du`
|
||||||
|
5. Investigate `/nix/store` roots when large toolchains still persist
|
||||||
|
6. Summarize reclaimed space and next candidate actions
|
||||||
|
7. Record new machine-specific ignore paths or cleanup patterns in this skill
|
||||||
|
|
||||||
|
## Step 1: Baseline
|
||||||
|
|
||||||
|
Run a quick baseline before deleting anything:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
df -h /
|
||||||
|
df -h /home
|
||||||
|
df -h /nix
|
||||||
|
```
|
||||||
|
|
||||||
|
Optionally add a quick home-level size snapshot:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
du -xh --max-depth=1 "$HOME" 2>/dev/null | sort -h
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 2: Easy Wins
|
||||||
|
|
||||||
|
Use these first when the user wants fast, low-effort reclaiming:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo -n nix-collect-garbage -d
|
||||||
|
sudo -n docker system prune -a
|
||||||
|
sudo -n podman system prune -a
|
||||||
|
```
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- Add `--volumes` only when the user approves deleting unused volumes.
|
||||||
|
- Re-check free space after each command to show impact.
|
||||||
|
- Prefer `sudo -n` first so cleanup runs fail fast instead of hanging on password prompts.
|
||||||
|
|
||||||
|
## Step 3: Rust Build Artifact Cleanup
|
||||||
|
|
||||||
|
Target common roots first: `~/Projects` and `~/code`.
|
||||||
|
|
||||||
|
Use `cargo-sweep` in dry-run mode before deleting:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run nixpkgs#cargo-sweep -- sweep -d -r -t 30 ~/Projects ~/code
|
||||||
|
```
|
||||||
|
|
||||||
|
Then perform deletion:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run nixpkgs#cargo-sweep -- sweep -r -t 30 ~/Projects ~/code
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternative for toolchain churn cleanup:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run nixpkgs#cargo-sweep -- sweep -r -i ~/Projects ~/code
|
||||||
|
```
|
||||||
|
|
||||||
|
Recommended sequence:
|
||||||
|
|
||||||
|
1. Run `-t 30` first for age-based stale builds.
|
||||||
|
2. Run a dry-run with `-i` next.
|
||||||
|
3. Apply `-i` when dry-run shows significant reclaimable space.
|
||||||
|
|
||||||
|
## Step 4: Investigation with `ncdu` and `du`
|
||||||
|
|
||||||
|
Avoid mounted or remote filesystems when profiling space. Load ignore patterns from `references/ignore-paths.md`.
|
||||||
|
|
||||||
|
Use one-filesystem scans to avoid crossing mounts:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ncdu -x "$HOME"
|
||||||
|
sudo ncdu -x /
|
||||||
|
```
|
||||||
|
|
||||||
|
When excluding known noisy mountpoints:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ncdu -x --exclude "$HOME/keybase" "$HOME"
|
||||||
|
sudo ncdu -x --exclude /keybase --exclude /var/lib/railbird /
|
||||||
|
```
|
||||||
|
|
||||||
|
If `ncdu` is missing, use:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run nixpkgs#ncdu -- -x "$HOME"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 5: `/nix/store` Deep Dive
|
||||||
|
|
||||||
|
When `/nix/store` is still large after GC, inspect root causes instead of deleting random paths.
|
||||||
|
|
||||||
|
Useful commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix path-info -Sh /nix/store/* 2>/dev/null | sort -h | tail -n 50
|
||||||
|
nix-store --gc --print-roots
|
||||||
|
```
|
||||||
|
|
||||||
|
Avoid `du -sh /nix/store` as a first diagnostic; it can be very slow on large stores.
|
||||||
|
|
||||||
|
For repeated GHC/Rust toolchain copies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix path-info -Sh /nix/store/* 2>/dev/null | rg '(ghc|rustc|rust-std|cargo)'
|
||||||
|
nix-store --gc --print-roots | rg '(ghc|rust)'
|
||||||
|
```
|
||||||
|
|
||||||
|
Resolve why a path is retained:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/home/imalison/dotfiles/dotfiles/lib/functions/find_store_path_gc_roots /nix/store/<store-path>
|
||||||
|
nix why-depends <consumer-store-path> <dependency-store-path>
|
||||||
|
```
|
||||||
|
|
||||||
|
Common retention pattern on this machine:
|
||||||
|
|
||||||
|
- Many `.direnv/flake-profile-*` symlinks under `~/Projects` and worktrees keep `nix-shell-env`/`ghc-shell-*` roots alive.
|
||||||
|
- Quantify before acting:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
find ~/Projects -type l -path '*/.direnv/flake-profile-*' | wc -l
|
||||||
|
find ~/Projects -type d -name .direnv | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
- If counts are high and the projects are inactive, propose targeted `.direnv` cleanup for user confirmation.
|
||||||
|
|
||||||
|
## Safety Rules
|
||||||
|
|
||||||
|
- Do not delete user files directly unless explicitly requested.
|
||||||
|
- Prefer cleanup tools that understand ownership/metadata (`nix`, `docker`, `podman`, `cargo-sweep`) over `rm -rf`.
|
||||||
|
- Present a concise “proposed actions” list before high-impact deletes.
|
||||||
|
- If uncertain whether data is needed, stop at investigation and ask.
|
||||||
|
|
||||||
|
## Learning Loop (Required)
|
||||||
|
|
||||||
|
Treat this skill as a living playbook.
|
||||||
|
|
||||||
|
After each disk cleanup task:
|
||||||
|
|
||||||
|
1. Add newly discovered mountpoints or directories to ignore in `references/ignore-paths.md`.
|
||||||
|
2. Add validated command patterns or caveats discovered during the run to this `SKILL.md`.
|
||||||
|
3. Keep instructions practical and machine-specific; remove stale guidance.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
interface:
|
||||||
|
display_name: "Disk Space Cleanup"
|
||||||
|
short_description: "Find safe disk-space wins on NixOS hosts"
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# Ignore Paths for Disk Investigation
|
||||||
|
|
||||||
|
Use this file to track mountpoints or directories that should be excluded from `ncdu`/`du` scans because they are remote, special-purpose, or noisy.
|
||||||
|
|
||||||
|
## Known Ignores
|
||||||
|
|
||||||
|
- `$HOME/keybase`
|
||||||
|
- `/keybase`
|
||||||
|
- `/var/lib/railbird`
|
||||||
|
- `/run/user/*/doc` (FUSE portal mount; machine-specific example observed: `/run/user/1004/doc`)
|
||||||
|
|
||||||
|
## Discovery Commands
|
||||||
|
|
||||||
|
List mounted filesystems and spot special mounts:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
findmnt -rn -o TARGET,FSTYPE,SOURCE
|
||||||
|
```
|
||||||
|
|
||||||
|
Target likely remote/special mounts:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
findmnt -rn -o TARGET,FSTYPE,SOURCE | rg '(keybase|fuse|rclone|s3|railbird)'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Maintenance Rule
|
||||||
|
|
||||||
|
When a disk cleanup run encounters a mount or path that should be ignored in future runs, add it here immediately with a short note.
|
||||||
Reference in New Issue
Block a user