Communitygithub.com

mac-declutter

macOS 개발 머신을 심층 정리하는 에이전트 스킬: AI 에이전트 스프롤, 좀비 서비스, 앱 찌꺼기, 프록시 트랩, 캐시 제거, 성능 감사

mac-declutter란 무엇인가요?

mac-declutter는 개발자의 Mac을 철저히 정리하기 위한 실전 검증된 플레이북입니다. 이 스킬은 사용자에게 삭제 전 목록을 먼저 보여주고(AI 에이전트 설정 디렉토리, 백그라운드 서비스, 앱, 캐시 등), 확인 후에만 제거를 진행하는 ‘인벤토리 우선’ 방식을 따릅니다. 또한 데드 로컬 프록시로 인한 네트워크 장애를 진단하는 방법, 앱 완전 제거를 위한 단계별 절차(서비스 중지, plist 삭제, 앱/CLI 삭제, 라이브러리 찌꺼기 정리), 성능 감사(메모리 압력, 스왑, RSS 분석)를 제공합니다. 캐시는 안전하게 제거하되 세션 기록이나 사용자 데이터는 건드리지 않으며, 시스템 무결성 보호(SIP)는 우회하지 않습니다. 모든 macOS 버전에서 Claude Code, Cursor, Codex 등 다양한 AI 에이전트와 호환되며, bash 및 osascript 명령어를 통해 동작합니다.

지원 대상✓Claude Code✓Codex CLI~Cursor✓OpenCode
npx skills add Offwhite-Del/mac-declutter

즐겨 사용하는 AI에게 물어보기

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

문서

mac-declutter은(는) 무엇을 하나요?

개발자 Mac을 정리하기 위한 실전 검증된 플레이북: AI 에이전트 스프롤, 죽은 백그라운드 서비스, 앱 찌꺼기, 프록시 트랩, 성능 감사.

핵심 원칙:

  • 삭제 전에 목록을 먼저 확인하세요. 블라인드 제거는 절대 하지 마십시오 — 크기, 마지막 사용 날짜, 실행 상태를 먼저 측정하고 사용자가 선택하도록 하십시오.
  • 명시적으로 요청하지 않는 한 세션 기록이나 사용자 데이터는 건드리지 마십시오. 캐시는 재생성되지만 세션은 그렇지 않습니다.
  • 모든 변경 후 확인하십시오 — 프로세스가 사라졌는지, 포트가 닫혔는지, 로그인 항목이 제거되었는지.
  • 시스템 무결성 보호(SIP)는 절대 우회하지 않습니다. 루트 소유 앱, 샌드박스 컨테이너, DriverKit 확장에는 각각 공식 제거 경로가 있습니다. OS를 무력화하지 마십시오.

0단계 — 네트워크 트라이지 (먼저 수행)

증상: "모든 것이 연결 해제됨"은 거의 항상 로컬 프록시 데드로 인한 것이지 앱 문제가 아닙니다:

scutil --proxy                       # 시스템 프록시가 가리키는 곳
nc -z -w 2 127.0.0.1 <port>        # 실제로 리스닝 중인 포트가 있나요?
lsof -nP -iTCP:<port> -sTCP:LISTEN # 누가 소유하고 있나요?

고전적인 함정: Clash/V2Ray 스타일 도구는 macOS 시스템 프록시를 127.0.0.1:PORT로 설정하고, 코어가 죽으면 — 규칙 모드는 중요하지 않으며, 모든 트래픽이 문 앞에서 죽습니다. 시스템 프록시를 따르는 앱(대부분의 GUI 앱, 일부 CLI)은 모두 실패합니다. curl은 시스템 프록시를 우회하기 때문에 여전히 작동하여 진단을 오해하게 만듭니다. 수정 방법: 프록시 코어 재시작, 또는 프록시 비활성화 (networksetup -setwebproxystate Wi-Fi off + -setsecurewebproxystate + -setsocksfirewallproxystate + WPAD off), 또는 앱 자체의 프록시 설정을 빈 값으로 변경하십시오. 기억: curl은 시스템 프록시를 무시합니다 — 앱 스타일 연결성을 테스트하려면 curl -x http://127.0.0.1:PORT를 사용하십시오.

1단계 — 인벤토리 (읽기 전용)

scripts/inventory.sh를 실행하거나 다음 항목을 수동으로 확인하십시오:

  • 에이전트 설정 디렉토리: ~/.claude, ~/.codex, ~/.pi, ~/.jcode, ~/.config/opencode 등. 각각: 크기 (du -sh), 마지막 활동 (가장 최근 파일 mtime), CLI 바이너리 존재 여부 (which).
  • 로그인/인증 상태: auth.json, openai-auth.json, 자격 증명 파일 — 키는 나열하되 비밀번호는 절대 출력하지 마십시오.
  • 백그라운드 서비스: launchctl list | grep -v com.apple 및 ~/Library/LaunchAgents/*.plist — 각 plist의 ProgramArguments를 읽어 실제로 실행되는 항목을 확인하십시오.
  • 앱: /Applications 및 ~/Applications에 있는 모든 비 Apple .app에 대해 크기, kMDItemLastUsedDate (mdls 사용), _MASReceipt 존재 여부(앱 스토어 앱)를 수집하십시오. "한 번도 열리지 않음" + 대용량 = 최적의 후보.
  • 캐시: ~/Library/Caches, ~/.npm, pip/bun 캐시 — 크고 항상 안전하게 제거 가능.

결과를 keep/remove 테이블로 표시하고 사용자가 선택하도록 하십시오. 유료/구독 앱(예: _MASReceipt, 알려진 구독 제품)은 플래그를 표시하여 삭제 전에 사용자가 청구를 취소하도록 하십시오.

2단계 — 제거 플레이북

대상별, 순서대로:

  1. 서비스 중지: 관련된 모든 LaunchAgent/Daemon에 대해 launchctl remove <label>.
  2. plist 삭제: ~/Library/LaunchAgents/<label>.plist.
  3. 앱/CLI 삭제: rm -rf .app / npm uninstall -g <pkg> / 바이너리 제거.
    • Permission denied → 루트 소유(pkg 설치). osascript -e 'do shell script "rm -rf ..." with administrator privileges' 사용 (GUI 비밀번호 프롬프트 한 번). 절대 sudo를 맹목적으로 사용하지 마십시오.
  4. 라이브러리 찌꺼기: ~/Library/{Application Support,Caches,Containers,HTTPStorages,Preferences}/<app-or-bundle-id> 확인 후 제거.
    • 샌드박스 Containers/*는 루트에도 저항할 수 있음(컨테이너 관리자 보호). 크기가 작으면 그대로 두십시오 — OS가 고아 컨테이너를 수거합니다. SIP를 비활성화하는 것은 절대 가치가 없습니다.
  5. 시스템 확장: systemextensionsctl list. SIP가 직접 제거를 차단합니다 — 유일한 깨끗한 경로는 벤더 앱을 재설치하고 공식 제거 프로그램을 실행하는 것입니다 (/Library/Application Support/<vendor>/ 아래 uninstall.sh 찾기). DriverKit .dext 드라이버는 다음 재부팅 시에만 언로드됩니다 — 사용자에게 재시작 후 사라진다고 알리십시오.
  6. 오래된 로그인 항목: 앱을 삭제한 후에도 "Open at Login" 항목이 좀비로 남아 있는 경우가 많습니다. osascript -e 'tell application "System Events" to delete login item "<name>"'로 제거하십시오.
  7. 실행 중인 찌꺼기: 삭제된 앱이 업데이터 임시 디렉토리(예: Squirrel ShipIt 스테이징)에서 프로세스를 남길 수 있습니다. ps aux | grep -i <name>, 프로세스를 종료하고 $HOME (~/.<appname>)에 데이터 디렉토리가 있는지 확인하십시오 — 업데이터가 생성한 데몬이 수백 MB를 숨기는 경우가 있습니다.

3단계 — 캐시 제거 (위험 없음)

npm cache clean --force
rm -rf ~/Library/Caches/pip ~/.bun/install/cache
rm -rf ~/Library/Caches/<deleted-app>/*

캐시는 재생성됩니다. 세션 기록(sessions/, projects/, *.jsonl 대화 로그)은 그렇지 않습니다 — 사용자가 명시적으로 요청하지 않는 한 그대로 두십시오.

4단계 — 성능 감사

memory_pressure | tail -2    # 여유 % 및 압력
sysctl -n vm.swapusage       # 스왑 사용량: 정상 머신에서는 ~0이어야 함
sysctl -n vm.loadavg
ps -axm -o rss,comm | awk 'NR>1 {rss=$1; $1=""; sub(/^ /,""); a[$0]+=rss} END {for (k in a) printf "%d\t%s\n", a[k]/1024, k}' | sort -rn | head -15
  • Activity Monitor의 "사용된 메모리"는 파일 캐시를 포함합니다 — GB 숫자가 아니라 메모리 압력 색상과 스왑으로 판단하십시오.
  • 대량 삭제 후 Spotlight(mds_stores, corespotlightd)는 몇 시간 동안 다시 인덱싱합니다 — 일시적이므로 "고치려" 하지 마십시오.
  • 앱 패밀리별로 RSS를 그룹화하십시오(브라우저와 채팅 앱은 많은 헬퍼를 생성). 프로세스별 잡음이 아닌 패밀리별 합계를 보고하십시오.
  • 문제가 없는 것을 최적화하지 마십시오: 스왑이 0이고 녹색 압력 상태의 머신에서 일상 사용자 경험(예: 스마트 IME)을 수백 MB와 교환하는 것은 나쁜 거래입니다 — 그렇게 말하십시오.

5단계 — 최종 확인

  • 삭제된 레이블이 launchctl list에 없음; plist 없음; 삭제된 이름과 일치하는 프로세스 없음(재부팅 보류 드라이버 제외).
  • 프록시 포트 리스닝이 scutil --proxy와 일치함; 주요 API 엔드포인트에 연결 가능 (401 = 연결 가능하지만 인증 필요, 이는 통과).
  • 각각의 남아있는 에이전트 CLI가 실제 종단 간 테스트를 통과함(한 줄 프롬프트 전송, 응답 예상).
  • df -h / 전후 점수 확인.

관련 스킬