# Content Cleaner

> 콘텐츠 프로젝트의 중간 원고·이미지·렌더·캐시·중복 자료를 조사하고, 보존 근거와 참조 관계를 확인한 뒤 불필요한 파일을 정리해 공간을 확보한다. “청소기”, “콘텐츠 프로젝트 청소”, “중간 이미지 정리”, “불필요한 산출물 삭제” 요청에 사용한다. 스킬 제작 요청 자체는 실제 청소 요청으로 해석하지 않는다.

- Skill: `formars0309-cloud/content-cleaner` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add formars0309-cloud/content-cleaner`
- Raw SKILL.md: https://api.skillmd.com/api/skills/formars0309-cloud/content-cleaner/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: formars0309-cloud (https://skillmd.com/u/formars0309-cloud)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/formars0309-cloud/content-cleaner

---


# 청소기

콘텐츠 제작 프로젝트를 폭넓게 조사하되, 삭제는 증거가 있는 개별 파일로 좁힌다. 사용자가 청소를 요청하면 조사만 하고 멈추지 말고 안전하게 삭제할 수 있는 항목을 정리한다. 확인되지 않은 자료는 보존하고 보류 이유를 남긴다. ‘전부 청소’도 보호 대상 삭제 권한은 아니다.

## 범위와 보호 대상

- 기본 탐색 시작점은 `~/orca/projects/`, `~/Projects/`다. 각 하위 프로젝트의 AGENTS.md와 작업·제작 기록을 읽고 블로그·웹툰·영상·문서 등 콘텐츠 제작 프로젝트를 식별한다. 이름만 보고 콘텐츠 프로젝트로 확정하지 않는다. 별도 저장소나 외장 경로는 실제 프로젝트 설정에서 확인된 경로만 포함한다. 누락·접근 실패 경로를 보고한다.
- 저장소 정본, 원본 이미지·편집 가능한 소스, 최종 납품·업로드 파일, 공개 페이지에서 참조하는 파일, 제작 manifest·채택 기록, 인용·출처·라이선스·승인·검수 증거는 보호한다. 원본과 리사이즈본, 시안과 최종본은 서로 대체 가능한 백업이 아니다.
- `.git`, 자격증명, 개인정보·환자 자료, 앱 데이터, 동기화 서비스 내부, 다른 에이전트의 작업물은 자동 삭제하지 않는다. 심볼릭 링크는 따라가지 않는다. 의존성 디렉터리와 가상환경의 대량 삭제는 이 스킬의 콘텐츠 청소 범위에서 제외한다.
- 현재 작업자·터미널·제작 기록과 파일 변경 상태를 확인한다. 최근 수정 여부는 보조 신호다. 활동 상태가 불명확한 프로젝트는 조사만 하고 삭제를 보류한다. 프로젝트·워크트리 자체 삭제는 별도 범위이며 필요한 경우 해당 관리 스킬과 백업 검증을 사용한다.

## 조사

아래 스크립트는 읽기 전용이다. 명시한 콘텐츠 프로젝트만 조사하며 이름에 따른 후보 표시는 삭제 판단이 아니다.

```bash
python3 <스킬경로>/scripts/inventory.py --root '<콘텐츠 프로젝트>' --output '<프로젝트 밖 보고서 경로>/inventory.json' --hash-duplicates
```

`--root`를 반복해 프로젝트를 추가한다. 처음에는 해시 옵션 없이 규모를 파악해도 된다. 보고서는 기본 `~/Library/Logs/content-cleaner/<실행시각>/`에 모으며 저장소에 개인정보·경로 목록을 커밋하지 않는다. 프로젝트별 총량, 큰 파일, 중간 산출물 후보, 동일 해시 묶음, 건너뛴 경로와 오류를 확인한다. 논리 크기와 할당 크기를 구분한다.

후보별로 본문·코드·MDX·HTML·CSS·제작 manifest·업로드 순서표·채택 기록에서 경로, 파일명, 상대경로, URL 인코딩 경로를 검색한다. 동적 파일명·glob·설정 기반 참조도 확인한다. 문자열 검색 결과가 없다는 것만으로 미사용을 확정하지 않는다. 로컬 참조 관계만으로 공개 서비스의 사용 여부를 판단할 수 없으면 보호한다.

## 삭제 판정

| 종류 | 자동 삭제 가능한 근거 | 보류하는 경우 |
| --- | --- | --- |
| 동일 중복본 | 파일 SHA-256 일치, 보존처 실재, 삭제 경로가 참조되지 않음, 보존처를 이번 삭제에서 제외 | 이름만 유사, 공개 URL만 있음, 보존처도 후보, 하드링크를 별도 확보 용량으로 계산 |
| 미채택 시안·중간 원고 | 미채택/폐기 기록과 보존된 동일 백업 확인 | AI 재생성 가능하다는 추정, 최종본과 내용 다름, 유일본 |
| 파생 렌더·미리보기·임시 변환본 | 원본·설정·도구가 남고 실제 재생성 검증 완료, 채택/참조되지 않는 산출물임을 확인 | 유료 API 재호출 필요, 원본·폰트·버전 누락, 손편집 여부 불명 |
| 캐시·실패한 임시 산출물 | 생성 도구·용도가 확인되고 원본 정보가 없으며 작업 종료·재생성 가능 확인 | 확장자나 tmp/cache 이름만으로 추정, 진행 중 다운로드·렌더 |
| 빈 폴더 | 정리 후 비어 있고 빌드·앱에서 필요로 하지 않음 | 작업 중 폴더, 구조상 필수 폴더 |

Git의 추적·커밋 여부 자체는 삭제 근거가 아니다. 로컬 커밋만 있는 유일본은 자동 삭제하지 않는다. 원격 보존을 근거로 삼으면 실제 원격 ref를 확인하고 해당 파일 blob을 조회할 수 있는지 검증한다. LFS 포인터만 보존된 경우 원본 백업으로 인정하지 않는다. 추적 파일 삭제는 프로젝트 변경으로 취급하고 필요한 빌드·링크 검증을 수행한다. 자격증명·비공개 자료를 백업 명목으로 자동 업로드하지 않는다.

## 실행과 검증

1. 삭제 계획 JSON에 정확한 절대경로, 크기, 해시, 판정 종류, 근거, 보존처, 참조·활동 확인 결과를 기록한다. 보존처와 삭제 대상이 겹치거나 순환하지 않는지 확인한다. 계획과 보고서는 삭제 대상 밖에 둔다.
2. 청소 요청으로 승인된 안전 항목은 재승인 없이 진행한다. 유일본의 영구 삭제 등 사용자 전담 사항은 제외하고 나머지를 먼저 끝낸다. 검사만 요청했다면 삭제하지 않는다.
3. 삭제 직전에 파일 종류·크기·mtime·해시와 보존처를 다시 검증한다. 변경되었거나 경로 구성 요소가 심볼릭 링크이면 해당 항목을 건너뛴다. 작업자가 새로 시작한 프로젝트도 건너뛴다. 사전 검증과 삭제 사이 경쟁 가능성이 있으면 실행하지 않는다.
4. 와일드카드·디렉터리 재귀 삭제 대신 검증한 개별 일반 파일에만 Python `Path.unlink()` 등으로 삭제한다. 성공·실패를 파일별로 즉시 로그에 남긴다. 빈 폴더는 검증 후 `rmdir()`만 사용한다. 휴지통 이동은 공간 확보 완료로 계산하지 않으며 기존 휴지통을 일괄 비우지 않는다.
5. 보존처 존속, 프로젝트의 참조·업로드 순서·필요한 빌드 결과를 확인한다. 실패하면 남은 삭제를 중단하고 검증된 보존처에서 가능한 복구를 수행한다. 중단·복구·미해결 항목을 보고한다. 청소를 이유로 공개 발행·재배포하지 않는다.

결과는 조사한 프로젝트 수, 삭제 파일 수와 종류, 삭제 근거, 삭제한 논리 용량, 할당 용량 추정, 실행 전후 파일시스템 여유 공간, 보류 항목과 보고서 경로로 보고한다. APFS 클론·스냅샷·동시 작업 때문에 여유 공간 변화는 삭제 바이트와 다를 수 있다. 예상 용량을 실제 확보량으로 말하지 않는다. 오류가 있으면 전체 조사가 완료됐다고 하지 않는다.

