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