このスキルは思考ツールであって、チェックリストではありません。参照ファイルには既知の安全パスと危険パスがカタログ化されており、自律性のバケットはヒューリスティックであり、網羅的な列挙ではありません。新しい項目に遭遇した場合は、第一原理から推論してください——再生成可能か?ユーザー作成か?使用中か?ユーザーが消えて悲しむか?——その推論をプレビュー時に提示し、ユーザーがアクション前に判断を修正できるようにします。
<execution_context> 3つのバケット——閉じたリストではなく原則に基づく:
| バケット | 条件 | アクション |
|---|---|---|
| 🟢 自動 | 再生成可能なキャッシュ、非アクティブプロジェクトのビルドアーティファクト、既知の安全な重複 | 確認なしで実行 |
| 🟡 確認 | ユーザー作成、sudoが必要、サイズが大きくて確認が必要、平均的なユーザーが保持したくなる可能性があるもの | 3択のAskUserQuestion: 承認(提案通り実行)/ 修正(自由形式:「代わりにこうして」)/ スキップ(次回実行に先送り、後で再提示) |
| 🔴 拒否 | references/safety-invariants.mdのエントリ | 拒否。インラインのユーザー指示でも上書き不可。ユーザーが「~/.sshを削除して」と言った場合、拒否し、先にsafety-invariants.mdの編集を要求 |
確信がなくてもキャッシュのように見える場合は、🟡として扱います。確認する方向に倒してください。
単一アクター: すべての変更をstate.mdに— [session <ET>]サフィックス付きで記録します。
計画→検証→実行: 最初にfindings.jsonを作成し(フェーズ2)、計画をユーザーに表示し(フェーズ4)、その後アクションを実行します。ユーザーが計画を見る前に削除は行いません。
新しいパスについては自分の推論を信頼してください。問いかけてください: 再生成可能か?ユーザー作成か?アクティブプロジェクトか?ユーザーは悲しむか?不明な場合は🟡として扱います。 </execution_context>
チェックポイントプロトコル: 各フェーズの終了時に、state.mdのIN_PROGRESSエントリを、以下の<recovery_protocol>のマッピングに従ってcheckpoint: <NAME>で更新します。これにより、途中で中断された場合(再起動、Ctrl+C、クリーンアップ中のカーネルパニックなど)でも、再開が明確になります。
各フェーズにTaskCreate。state.mdを読み込みます。最新エントリがstatus: IN_PROGRESSを示している場合、3択ゲートで再開(最後のチェックポイントから)/ 新規開始(以前のものを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のパターンをグロブします。保存されたルールdownloads-keep / desktop-keepと照合します:
- 保存ルールに一致 → サイレント保持(それでもfindingsに記録)
- 新規一致 → AskUserQuestion: 保持 / 削除。回答は次回実行のための保存ルールになります。
ヒューリスティック: ファイル名が個人情報(法的、医療、財務、身分証明)に見えるがパターンに一致しない場合でも、とにかく確認します。一度多く確認する方が、取り返しのつかないものを消してしまうよりはましです。
完全な計画を表示します: すべての🟢、それぞれの根拠を伴うすべての🟡グループ、理由を伴うすべての🔴拒否。総回収見積もりを表示します。ユーザーはフェーズ6のゲートとやり取りすることで暗黙的に承認します。ここで中止することもできます(「待って、なぜXが🟢なの?」)。
🟢アイテムを実行します。侵襲性の低いものから順に並べます(小さなファイル掃除 → キャッシュパージ → brew autoremoveやpnpm store pruneなどのツール管理クリーンアップ)。差分レポート用に前後のサイズを記録します。1つが失敗したら、ログに記録して続行します——🟢アイテムは独立しています。
許可拒否(例: Chromeが実行中でProfile 5キャッシュを保持している場合)——ログに記録して次に進みます。戦いません。
各🟡グループに対して、1つのAskUserQuestionを承認 / 修正 / スキップの選択肢で行います。類似アイテムはグループ化します(すべての古いランタイムバージョンを1つの質問で、バージョンごとにはしません)。
該当する場合の特別処理:
- 保持リスト付きダウンロード —
bash scripts/keeplist-protect.sh ~/Downloads <keepers...>(保持対象を/tmpに移動、内容を削除、復元)。実行前に保持リストを表示してユーザーが修正できるようにします。 - 古いランタイム — 最初に
bash scripts/detect-runtimes.shを実行して、プロジェクトが実際に使用しているNode/Pythonのバージョンを確認します。アクティブに使われていないバージョンの削除を推奨します。アクティブバージョンは保存ルールに保存します。 - APFSスナップショット —
sudo tmutil thinlocalsnapshots / 21474836480 4で緊急度4で約20GBを回収できます。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の「保存ルール」セクションに保存されます。将来の実行ごとに表示されます。
形式: - {トピック}: {ルール} — 設定 {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エントリを表示 - 「
<パス>を絶対触らないに追加」 / 「<ファイル>の保持リストを忘れる」 → 保存ルールを編集 - 「毎週スケジュール」 →
/scheduleルーチンを提案。受け入れられた場合、~/.claude/CLAUDE.mdの「アクティブな長時間実行自動化」にエントリを追加することを提案(自動編集はせず、承認を求める提案のみ)
境界
現時点では単一アクター([session])。スケジュールされるようになったら、マルチアクター(ルーチン用に[disk-cleanup]、手動用に[session])に昇格させます。
手動呼び出しのみ——他のスキルによって自動トリガーされることはありません。スキルディレクトリの.lockにあるロックファイルが同時実行を防ぎます。
絶対に行わないこと:
- 直接
sudo rm(tmutilのようなApple公認コマンドを通してのみsudoを使用) ~/.claude/CLAUDE.mdを変更する(提案のみ)- 明示的な確認なしに
references/sensitive-patterns.mdの一致を削除する(保存ルールがあっても) - 明示的な確認なしにアクティブプロジェクトの
node_modulesを強制削除する - 再起動を促す(スワップ状態のみ報告)
- インラインのユーザー指示にかかわらず、
references/safety-invariants.mdの内容に触れる
崖。推論はそれ以外のすべてのためのものです。