Clean up disk space and uninstall macOS apps safely — disk usage checkup, app bundle and leftover review, system/app caches, dev junk (node_modules/Xcode/Docker/package-manager caches), large-file discovery, and dedup/leftover cleanup of agent skills directories; always checks and confirms before deleting. Use when the user says "disk full", "clean my mac", "free up space", "clear cache", "uninstall/remove an app", "my computer is slow, clean it up", or in Chinese "磁盘满了""清理电脑/Mac""释放空间""清理缓存""卸载/删除应用或软件""skills 太乱了清理一下", or when the system warns about low storage.
Resources
6Install
npx skillscat add imoonwander/moon-clean-skill Install via the SkillsCat registry.
Moon Clean
像 CleanMyMac 一样清理电脑,但每一步可见、可控、只删确认过的东西。

截图来自公开 GitHub 仓库页面,用于展示开源发布状态;不要使用合成终端图来冒充真实运行结果。若要展示清理数据,必须来自真实命令或真实报告,并先脱敏。
当前版本以 macOS 为主;Windows 支持后续按平台分节扩展(铁律和工作流骨架通用)。
铁律(先读)
- 先体检、后报告、经确认再删。任何删除前,必须列出将删路径 + 各自大小 + 总释放量,等用户确认。用户明确说"直接清"的例外,但仍要在删后报告清了什么。
- 绝不碰用户数据:
~/Documents~/Desktop~/Pictures、任何项目源码、.git目录、浏览器书签/密码。Downloads 只报告不主动删。 - 不用 sudo 删系统路径(
/System/Library顶层等);rm -rf只作用于逐条列出并确认过的绝对路径,禁止带通配符的整目录盲删。 - 卸载残留、旧备份这类"看起来没用"的东西,宁可标记为"建议人工确认"也不要自作主张。
工作流
第 1 步:体检
优先跑自带脚本(只读,不删任何东西):
scripts/checkup.sh --save # --save 把报告存档到 ~/.moon-clean/reports/(可用 MOON_CLEAN_REPORT_DIR 覆盖)
# --no-scan 跳过较慢的 $HOME 大目录扫描
# --redact 隐去文件名与自定义目录名,适合分享;同时跳过大目录扫描报告自带分类标签(safe after confirm · review by tool · human confirm only)。存档权限固定为仅当前用户可读;即便如此,原始报告仍可能含本机路径和 Downloads 文件名,公开前必须使用 --redact 或人工脱敏。存档的报告是历史基线——下次体检可对比增量。脚本不可用时退回手动命令:
df -h /System/Volumes/Data # 总体空间(macOS 数据卷)
du -xsh ~/Library/Caches ~/Library/Logs ~/Downloads 2>/dev/null
du -xsh ~/Library/Developer 2>/dev/null # Xcode 相关
du -xsh ~/.npm ~/.pnpm-store ~/Library/pnpm ~/.cache ~/Library/Caches/pip 2>/dev/null
docker system df 2>/dev/null # Docker 占用
brew cleanup -n 2>/dev/null | tail -1 # brew 可回收量(-n 只预览)
du -xh -d 2 ~ 2>/dev/null | sort -rh | head -25 # 大目录排查(按需下钻)在报告基础上输出"占用体检表":路径 / 当前占用 / 类别(低风险可重建 · 建议清 · 需人工确认),结合上下文修正脚本给的静态标签。当前占用不等于可释放量;只有实际清理并复测后才能报告估算释放量。
第 2 步:分类清理(按安全度排序)
低风险可重建(仍有下载、索引或编译成本)
- 包管理器缓存:
brew cleanup --prune=all、npm cache clean --force、pnpm store prune、yarn cache clean、pip cache purge、uv cache clean - Xcode 垃圾:
~/Library/Developer/Xcode/DerivedData、~/Library/Developer/CoreSimulator/Caches - 应用缓存:先退出对应应用,优先使用应用自己的清理入口;手工处理
~/Library/Caches/<app>时逐个列大小,不做全目录清空 - 旧日志:
~/Library/Logs下超过 90 天的文件
建议清(会有一次性重建成本)
- 僵尸
node_modules/.venv:目录 mtime 只能生成候选清单,删除前还要核对项目近期活动、git 状态和重新安装成本;活跃项目不删 - Docker:
docker system prune(保留在用的);加-a前必须单独确认 - 模拟器旧设备:
xcrun simctl delete unavailable
需人工确认
~/Downloads大文件(只列 top 20,让用户勾选)~/Library/Application Support下已卸载应用的残留(对照 /Applications 找孤儿,列出来让用户认领)- iOS 设备备份:
~/Library/Application Support/MobileSync/Backup
第 3 步:卸载单个应用
应用卸载和系统体检是两条独立路径。用户点名应用时:
- 在
/Applications与~/Applications定位精确.app,显示实际路径和大小;名称相近时先让用户确认,不靠猜测选应用。 - 用
mdls -name kMDItemCFBundleIdentifier -raw <app-path>读取真实 bundle id,并检查应用是否正在运行;先正常退出,不强杀。 - 分两组列候选:主程序;由真实名称或 bundle id 对应的缓存、日志、偏好设置、Saved Application State。
Application Support、容器目录和云同步目录可能含用户数据,只列为“需人工确认”。 - 主程序和每一项残留分别列路径、大小、风险,得到确认后优先移入废纸篓;不要直接永久删除。需要管理员权限的应用只报告,不绕过权限。
- 移动后验证原路径不存在、废纸篓中存在目标,并把实际结果写入清理日志。未找到的路径记为“未发现”,不能记为“已删除”。
不得只按应用显示名做全盘模糊删除,也不得因为文件名含同一个单词就判定为残留。
第 4 步:Agent skills 清理
skills 会越积越多,专门检查:
ls ~/.claude/skills/ # 个人 skills
du -sh ~/.claude/skills/* 2>/dev/null | sort -rh- 重复功能:读各 SKILL.md 的 description,找功能重叠的 skill(如新旧两版域名查询),列出建议保留哪个、删哪个。
- 残留工作区:
*-workspace、cache、临时产物目录,确认后清。 - 失效 skill:指向已删除路径的符号链接、引用了不存在脚本的 skill。
- 若用户通过源码仓统一管理 skills,本机
~/.claude/skills/与~/.codex/skills/中的对应目录应指向用户自己的唯一源码目录;发现是拷贝而非链接时,提示改回链接,避免两份漂移。
第 5 步:收尾报告
清理完成后重新运行 scripts/checkup.sh --save --no-scan,报告:清理前可用空间 → 清理后可用空间、估算释放量、各类别明细、执行过的命令、失败项、跳过项及原因。
把清理记录保存到 ~/.moon-clean/history/cleanup-<timestamp>.md,权限设为 600。记录只写真实执行结果;若命令失败,不得按计划值计入释放量。日志可能包含本机路径,公开前必须脱敏。