Community生產力與協作github.com

adam-j-ali/disk-cleanup

在 macOS 上安全清理可再生的快取、舊版執行環境與大型一次性檔案,釋放磁碟空間。請於使用者要求「清理磁碟」、「釋放空間」、「儲存空間不足」等與磁碟壓力相關的提示時使用。

disk-cleanup 是什麼?

此技能專為 macOS 設計,可智慧分類與安全清理磁碟空間。它能分析系統中可再生的快取、舊版執行環境(如 Node、Python)與大型一次性檔案,並依據安全規則與使用者自訂的保留清單,將發現的項目歸類為 🟢(自動清理)、🟡(三選一詢問:核准/修改/跳過)或 🔴(拒絕執行,例如涉及 SSH 金鑰或系統機密路徑)。技能支援 Cursor 與 Claude Code 等平台,可透過單一指令(如「clean my disk」)或特定子命令(如「Just empty trash」)觸發。它採用階段性流程(初始化、盤點、分類、敏感掃描、預覽、執行、報告),並可透過 `state.md` 的 IN_PROGRESS 標記從中斷點恢復執行。核心優勢在於基於「能否再生?」、「是否使用者建立?」、「是否活躍專案?」等第一原則進行推理,而非仰賴固定的核取清單,因此能適應不同機器的獨特環境,同時確保絕不觸碰憑證、專案原始碼或系統內部檔案。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/adam-j-ali/claude-skills/tree/HEAD/plugins/disk-cleanup

Installed? Explore more 生產力與協作 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

此技能是一種思考工具,而非核取清單。參考資料記錄了已知安全與已知危險的路徑;自主性儲存格是啟發式規則,而非窮舉列舉。當你遇到新事物時,從第一原則推理——可再生的嗎?使用者建立的嗎?正在使用中嗎?使用者會因為它消失了而難過嗎?——並在預覽時將推理過程展現出來,以便使用者在採取行動前能修正你的判斷。

<execution_context> 三個儲存格——原則,而非封閉清單:

儲存格時機動作
🟢 自動可再生的快取、非活躍專案中的建置產物、已知安全的重複檔案逕行執行,無需詢問
🟡 詢問使用者建立的、需要 sudo、大到需要進行合理性檢查、任何理性的人可能會想保留的地方使用 AskUserQuestion 提供 3 個選項:核准(按提議執行)/ 修改(自由形式:「告訴我怎麼做」)/ 跳過(延至下次執行,之後會再次提出)
🔴 拒絕references/safety-invariants.md 中的條目拒絕。沒有內聯的使用者指示可以覆蓋它們。如果使用者說「刪除我的 .ssh」,請拒絕,並要求先編輯 safety-invariants.md

如果你不確定但它看起來像是快取,請視為 🟡 處理。寧可多問也不要錯過。

單一執行者:在 state.md 中記錄每次變更,並加上 — [session <ET>] 後綴。

規劃-驗證-執行:先建立 findings.json(階段 2),向使用者顯示計畫(階段 4),然後再行動。在使用者看到計畫之前,不得進行任何刪除。

相信你對新路徑的推理。問:可再生的嗎?使用者建立的嗎?活躍專案嗎?使用者會難過嗎?如果不確定,視為 🟡。 </execution_context>

檢查點協定: 在每個階段結束時,根據下方的 <recovery_protocol> 對應,更新 state.md 中的 IN_PROGRESS 條目,加上 checkpoint: <NAME>。這可讓中斷時(例如重新開機、ctrl-C、清理中途發生核心恐慌)的恢復明確無誤。

為每個階段 TaskCreate。讀取 state.md。如果最新條目顯示 status: IN_PROGRESS,則透過三選一閘門詢問:恢復(從上次檢查點繼續)/ 重新開始(將先前的歸檔為 ABORTED)/ 顯示完整歷史(然後中止)。

將已儲存的規則以一個可掃描的區塊顯示在聊天頂部——這些是跨執行建立的保留清單與策略。使用者可以在你繼續之前先檢查它們。

前置檢查(低磁碟安全性): 如果 df -h / 顯示可用空間 < 500 MiB,則掃描本身會與空間競爭(/tmp 位於同一個磁碟區上)。在執行 scan-disk.sh 之前,詢問使用者是否可以先清空 ~/.Trash/——這幾乎總是能釋放出足夠的空間。此技能正是為此情境而打造;初始執行從 84 MiB 可用空間開始,且 du 串聯命令不可靠。請說明問題的嚴重性。

bash scripts/scan-disk.sh > /tmp/disk-cleanup-findings.json

唯讀的 du/df 串聯命令 + APFS 快照清單 (tmutil listlocalsnapshots /) + 交換空間狀態 (sysctl vm.swapusage) + 條件式 Xcode 開發路徑。

如果使用者提到了某個令他們困擾的特定資料夾,請針對該資料夾使用 du -sh 進行補充。推理比固定清單更有效。

對於盤點中的每個發現,使用 references/safety-invariants.md 和 references/auto-fix-categories.md 作為參考,決定它屬於哪個儲存格。為每個條目記錄理由——在預覽時,使用者看到的是你的推理,而不僅僅是結論。這就是建立信任的方式。

寫入 findings.json(你的暫存區——在階段 4 和 8 中使用)。

對於 🟡 目錄(尤其是 ~/Downloads、~/Desktop),使用 references/sensitive-patterns.md 中的模式進行 glob 匹配。將匹配結果與已儲存的規則 downloads-keep / desktop-keep 進行交叉比對:

  • 命中已儲存規則 → 靜默保留(仍記錄到 findings)
  • 新的匹配 → AskUserQuestion:保留 / 刪除。該答案將成為下次執行的已儲存規則。

啟發式規則:如果一個檔名看起來很個人(法律、醫療、財務、身份相關)但未匹配任何模式,仍然提問。與其摧毀一個無法取代的東西,不如多問一次。

顯示完整計畫:每個 🟢、每個帶有理由的 🟡 群組、每個帶有原因的 🔴 拒絕。估計總回收空間。使用者透過與階段 6 的閘門互動來隱式批准;他們也可以在此中止(「等等,為什麼 X 是綠色的?」)。

執行綠色項目。以最不具侵入性的順序進行(小型檔案清理 → 快取清除 → 工具管理的清理,如 brew autoremove 和 pnpm store prune)。記錄前後的容量大小以用於差異報告。如果某個項目失敗,記錄下來並繼續——綠色項目是各自獨立的。

權限被拒絕(例如,Chrome 在執行時持有 Profile 5 的快取)——記錄下來並繼續。不要與之對抗。

對於每個 🟡 群組,發出一次 AskUserQuestion,選項為核准 / 修改 / 跳過。將相似的項目分組在一起(例如所有舊版執行環境在一次詢問中提出,而不是每個版本一次)。

相關時的特殊處理:

  • 含有保留清單的下載 — bash scripts/keeplist-protect.sh ~/Downloads <keepers...>(將保留項目移至 /tmp,清空內容,還原)。在執行前顯示保留清單,以便使用者修改。
  • 舊版執行環境 — 先執行 bash scripts/detect-runtimes.sh 來查看專案實際使用了哪些 Node/Python 版本。建議刪除未在使用的版本;將活動中的版本儲存到已儲存的規則中。
  • APFS 快照 — sudo tmutil thinlocalsnapshots / 21474836480 4 以緊急度 4 回收約 20 GB。說明這需要 sudo。
  • 訊息/附件 — 先結束「訊息」應用程式 (osascript -e 'tell application "Messages" to quit'; sleep 3),然後 find ~/Library/Messages/Attachments -mindepth 1 -delete(保留 chat.db)。
  • Xcode DerivedData(如果存在) — 刪除是安全的;唯一的代價是下一次建置會變慢。

跳過的項目會延至下次執行——在 state.md 中註記它們,以便它們會再次出現。

簡潔的摘要:前後 df -h、按類別釋放的空間表格、來自 sysctl vm.swapusage 的交換空間狀態。將交換空間作為參考資訊提及——「如果您想要,重新開機可回收約 X GB 的交換空間」——請勿提示重新開機(由使用者決定)。

合理性檢查:檢查資源回收筒大小——如果它與我們刪除的量成比例增長,表示有些東西只是被移過去而非真正回收。請說明此情況。

按照 state.md 標頭中的格式附加一個執行條目。用本次執行中學到的任何內容更新已儲存的規則(新的活動中執行環境、新的敏感檔案決定)。如果完整條目超過 5 個,將最舊的條目滾入壓縮區段。

當提議新的已儲存規則時,請與使用者確認——請勿自動新增。這些規則是持久的;多問一次比較好。

將檢查點標記為 COMPLETED。

<saved_rules_format> 儲存在 state.md 的「Saved Rules」區段中。在每次後續執行時都會顯示。

格式:- {主題}: {規則} — 設定於 {YYYY-MM-DD ET}

自然浮現的主題(非窮舉——當模式重複時可發明新的):

  • downloads-keep, desktop-keep — 每個目錄的保留清單
  • active-node, active-python — 實際在使用的執行環境版本
  • active-projects — 絕對不碰的專案目錄
  • safe-cache-clear-paths — 經確認安全的自動清理路徑
  • *-policy — 一次性行為偏好(例如 swap-policy, threshold-policy) </saved_rules_format>

<recovery_protocol> 如果 state.md 顯示 status: IN_PROGRESS:

最後檢查點從何處恢復
INITIALIZED階段 1
INVENTORIED階段 2
CATEGORIZED階段 3
SENSITIVE_SCANNED階段 4
PREVIEWED階段 5
GREEN_EXECUTED階段 6
YELLOW_RESOLVED階段 7
REPORTED階段 8

詢問使用者:恢復 / 重新開始 / 顯示完整歷史。如果恢復,附加到現有條目中;請勿建立新條目。

在恢復前重新執行 df -h——如果磁碟狀態在中斷後發生實質變化,則重新提示。 </recovery_protocol>

<error_handling> 預設行為:記錄具體錯誤,跳過有問題的項目,繼續處理其餘部分。磁碟清理對於每個項目而言都是可獨立重新進入的。

僅在以下情況中止執行:

  • 掃描腳本完全失敗(findings.json 會是錯的)
  • 幾乎觸及了 🔴 路徑(分類錯誤 → 中止並調查)
  • 使用者說停止

對於其他所有情況(單一權限被拒絕、brew 鎖定、工具未安裝)——繼續進行並在最後報告。

如果在執行過程中可用空間降至 500 MiB 以下(在幾乎滿的磁碟上進行分類時可能發生,雖矛盾但可能),暫停階段 5,清空資源回收筒,然後恢復。findings.json 與其他所有東西位於同一個磁碟區上。 </error_handling>

<success_criteria>

  • state.md 中有新的條目,且 status: COMPLETED
  • df -h 在 Avail 欄位顯示非零的正向差異
  • 未觸及任何 🔴 路徑
  • 敏感匹配項目已被保留(帶有已儲存規則)或被使用者明確刪除
  • 使用者看到了差異報告
  • 資源回收筒大小經過合理性檢查(沒有假回收真搬運的情況) </success_criteria>

直接動作

當意圖明確時,跳過完整掃描:

  • 「清空資源回收筒就好」 → 確認大小,Y/N 後 rm -rf ~/.Trash/*
  • 「清理快取就好」 → 僅執行階段 5
  • 「試運行 / 顯示會被刪除的內容」 → 階段 1–4,在階段 5 之前停止
  • 「上次執行做了什麼?」 → 顯示最近的 state.md 條目
  • 「將 <path> 加入永不觸碰」 / 「忘記 <file> 的保留清單」 → 編輯已儲存的規則
  • 「安排每週執行」 → 提供 /schedule 例行程序;如果接受,提議將條目加入 ~/.claude/CLAUDE.md 的「Active Long-Running Automations」(請勿自動編輯——提議以供核准)

界線

目前為單一執行者([session])。當排程執行時,提升為多重執行者(例行使用 [disk-cleanup],手動使用 [session])。

僅限手動呼叫——絕不會被其他技能自動觸發。技能目錄中的 .lock 鎖定檔案可防止並行執行。

絕不:

  • 直接使用 sudo rm(僅透過 Apple 認可的命令如 tmutil 使用 sudo)
  • 修改 ~/.claude/CLAUDE.md(僅提議)
  • 在未經明確確認的情況下刪除 references/sensitive-patterns.md 的匹配項,無論已儲存的規則為何
  • 在未經明確詢問的情況下強制刪除活動中專案的 node_modules
  • 提示重新開機(僅報告交換空間狀態)
  • 無論內聯使用者指示為何,觸碰 references/safety-invariants.md 中的任何內容

這是斷崖。在其他所有地方使用推理。

相關技能