Community생산성 & 협업github.com

adam-j-ali/disk-cleanup

macOS에서 재생성 가능한 캐시, 오래된 런타임 버전, 대용량 일회성 아티팩트를 안전하게 정리하여 디스크 공간을 확보합니다. 사용자가 "디스크 정리", "공간 확보", "저장 공간 부족" 등을 요청할 때 사용합니다.

disk-cleanup란 무엇인가요?

이 스킬은 macOS 디스크 정리 작업을 안전하게 자동화하는 AI 어시스턴트 도구입니다. 사용자의 디스크 공간 부족 요청에 응답하여, 재생성 가능한 캐시와 빌드 아티팩트는 자동으로(🟢), 사용자 데이터나 대용량 항목은 사용자 승인(🟡)을 거쳐 정리하며, 민감한 파일이나 시스템 파일은 절대 건드리지 않습니다(🔴). 모든 결정은 사전에 정의된 안전 규칙(safety-invariants.md, sensitive-patterns.md)과 사용자가 이전 실행에서 설정한 유지 목록(keep-list)을 기반으로 이루어집니다. 각 발견 항목에 대한 판단 근거를 사용자에게 투명하게 공개하고, 작업 전에 전체 계획을 미리 보여주며, 중단 시에도 state.md를 통해 중간 지점부터 재개할 수 있습니다. Claude Code, Cursor, Codex 등 AI 에이전트 환경에서 작동하며, 단일 세션(session) 컨텍스트와 잠금 파일을 통해 동시 실행을 방지합니다.

지원 대상✓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에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

이 스킬은 생각하는 도구이지, 체크리스트가 아닙니다. 참조 파일들은 알려진 안전/위험 경로를 모아놓은 것이며, 자율 버킷은 완전한 목록이 아닌 휴리스틱입니다. 새로운 항목을 만났을 때는 기본 원칙부터 추론하세요 — 재생성 가능한가? 사용자가 만든 것인가? 현재 사용 중인가? 사라지면 사용자가 슬퍼할까? — 그리고 미리보기 시간에 그 추론 과정을 표시하여 사용자가 실행 전에 판단을 수정할 수 있게 하세요.

<execution_context> 세 가지 버킷 — 닫힌 목록이 아닌 원칙:

버킷조건행동
🟢 자동재생성 가능한 캐시, 활성 프로젝트가 아닌 빌드 아티팩트, 알려진 안전한 중복묻지 않고 실행
🟡 질문사용자가 만든 파일, sudo 필요, 충분히 커서 확인이 필요한 항목, 합리적인 사람이라면 보관하고 싶을 만한 경우3가지 옵션이 있는 AskUserQuestion: 승인 (제안대로 실행) / 수정 (자유 형식: "대신 이렇게 해줘") / 건너뛰기 (다음 실행으로 연기, 나중에 다시 표시)
🔴 거부references/safety-invariants.md의 항목거부. 인라인 사용자 명령도 이를 무시할 수 없습니다. 사용자가 ".ssh를 삭제해"라고 하면 거부하고 먼저 safety-invariants.md를 편집하도록 요구하세요

확실하지 않지만 캐시처럼 보이면 🟡로 처리하세요. 질문하는 쪽으로 오류를 범하세요.

단일 실행자: 모든 변경 사항을 state.md에 — [session <ET>] 접미사와 함께 기록하세요.

계획-검증-실행: 먼저 findings.json을 작성하고(Phase 2), 사용자에게 계획을 보여준 다음(Phase 4), 실행합니다. 사용자가 계획을 보기 전에는 삭제하지 마세요.

새로운 경로에 대한 추론을 신뢰하세요. 질문: 재생성 가능? 사용자 생성? 활성 프로젝트? 사용자가 슬퍼할까? 불확실하면 🟡로 처리하세요. </execution_context>

체크포인트 프로토콜: 각 단계가 끝날 때마다 아래 <recovery_protocol>의 매핑에 따라 state.md의 IN_PROGRESS 항목을 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를 참조하여 어떤 버킷에 속하는지 결정하세요. 각 항목 옆에 **근거(rationale)**를 함께 기록하세요 — 미리보기 시간에 사용자는 평결만이 아니라 당신의 추론 과정을 보게 됩니다. 이것이 신뢰가 구축되는 방법입니다.

findings.json을 작성하세요 (Phase 4와 8에서 사용할 스크래치패드입니다).

🟡 디렉토리(특히 ~/Downloads, ~/Desktop)에 대해 references/sensitive-patterns.md의 패턴을 glob으로 검색하세요. 일치 항목을 저장된 규칙 downloads-keep / desktop-keep와 교차 확인하세요:

  • 저장된 규칙과 일치 → 조용히 유지 (여전히 findings에 기록)
  • 새로운 일치 → AskUserQuestion: 유지 / 삭제. 답변은 다음 실행을 위한 저장된 규칙이 됩니다.

휴리스틱: 파일 이름이 개인적으로 보이지만(법률, 의료, 금융, 신원) 패턴과 일치하지 않으면 anyway 질문하세요. 대체 불가능한 것을 날려버리기보다 한 번 더 질문하는 것이 낫습니다.

전체 계획을 보여주세요: 모든 🟢, 근거가 포함된 모든 🟡 그룹, 이유가 포함된 모든 🔴 거부. 총 확보 용량을 추정하세요. 사용자는 Phase 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에서 약 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가 표시되면:

마지막 체크포인트재개 위치
INITIALIZEDPhase 1
INVENTORIEDPhase 2
CATEGORIZEDPhase 3
SENSITIVE_SCANNEDPhase 4
PREVIEWEDPhase 5
GREEN_EXECUTEDPhase 6
YELLOW_RESOLVEDPhase 7
REPORTEDPhase 8

사용자에게 질문: 재개 / 새로 시작 / 전체 기록 보기. 재개 시 기존 항목에 추가하세요; 새 항목을 만들지 마세요.

재개하기 전에 df -h를 다시 실행하세요 — 중단 이후 디스크 상태가 실질적으로 변경되었다면 다시 프롬프트하세요. </recovery_protocol>

<error_handling> 기본값: 특정 오류를 기록하고, 문제 항목을 건너뛰고, 나머지는 계속 진행하세요. 디스크 정리는 항목별로 독립적으로 재진입 가능합니다.

다음 경우에만 실행을 중단하세요:

  • 스캔 스크립트가 완전히 실패한 경우 (findings.json이 잘못됨)
  • 🔴 경로에 거의 닿을 뻔한 경우 (분류 버그 → 중단 + 조사)
  • 사용자가 중단을 요청한 경우

그 외 모든 것 (단일 권한 거부, brew 잠금, 도구 미설치)에 대해서는 — 계속 진행하고 마지막에 보고하세요.

실행 중 사용 가능 공간이 500 MiB 아래로 떨어지면 (거의 가득 찬 디스크에서 분류 중에 역설적으로 가능), Phase 5를 일시 중지하고, 휴지통을 비운 후 재개하세요. findings.json은 다른 모든 파일과 같은 볼륨에 있습니다. </error_handling>

<success_criteria>

  • state.md에 status: COMPLETED인 새 항목이 있음
  • df -h에서 Avail에 양의 델타가 있음
  • 🔴 경로가 전혀 건드려지지 않음
  • 민감 일치 항목이 유지되거나 (저장된 규칙 포함) 사용자가 명시적으로 삭제했음
  • 사용자가 델타 보고서를 보았음
  • 휴지통 크기가 확인됨 (제거로 위장한 이동 없음) </success_criteria>

직접 실행

다음 의도가 명확할 때는 전체 정리를 건너뛰세요:

  • "그냥 휴지통 비워줘" → 크기 확인 후, Y/N 후 rm -rf ~/.Trash/*
  • "캐시만 정리해줘" → Phase 5만 실행
  • "가상 실행 / 무엇이 삭제될지 보여줘" → Phase 1–4, Phase 5 전에 중단
  • "마지막 실행에서 뭘 했어?" → 가장 최근 state.md 항목 표시
  • "<경로>를 건드리지 않는 목록에 추가해" / "<파일>의 유지 목록을 잊어" → 저장된 규칙 편집
  • "매주 예약해" → /schedule 루틴 제안; 수락되면 ~/.claude/CLAUDE.md의 "활성 장기 실행 자동화"에 항목 추가 제안 (자동 편집 금지 — 승인을 위해 제안)

경계

현재는 단일 실행자 ([session])입니다. 예약 시 다중 실행자 ([disk-cleanup] 루틴용, [session] 수동용)로 승격하세요.

수동 호출만 가능 — 다른 스킬에 의해 자동으로 트리거되지 않습니다. 스킬 디렉토리의 .lock 잠금 파일이 동시 실행을 방지합니다.

절대:

  • sudo rm을 직접 사용하지 마세요 (sudo는 tmutil과 같은 Apple 승인 명령어를 통해서만)
  • ~/.claude/CLAUDE.md를 수정하지 마세요 (제안만 가능)
  • 저장된 규칙과 관계없이 references/sensitive-patterns.md 일치 항목을 명시적 확인 없이 삭제하지 마세요
  • 활성 프로젝트의 node_modules를 명시적 질문 없이 강제 삭제하지 마세요
  • 재부팅을 유도하지 마세요 (스왑 상태만 보고)
  • 인라인 사용자 명령과 관계없이 references/safety-invariants.md의 항목을 건드리지 마세요

절벽. 그 외의 모든 곳에서는 추론을 사용하세요.

관련 스킬