Community코딩 & 개발github.com

Tidy · 프로젝트 정리 규칙

AI가 생성한 프로젝트의 파일을 검토하여 불필요한 파일을 식별하고, 올바른 디렉토리에 배치하며, 일관된 이름 규칙을 적용하여 프로젝트를 깔끔하고 유지보수하기 쉽게 만듭니다.

Tidy · 프로젝트 정리 규칙란 무엇인가요?

Tidy는 AI 에이전트가 프로젝트의 파일 구조를 체계적으로 관리하고 정리할 수 있도록 도와주는 스킬입니다. 이 스킬은 각 파일의 필요성, 위치, 가독성을 평가하여 프로젝트 루트 디렉토리를 깔끔하게 유지하고, 파일 이름을 일관되게 지정하며, 디렉토리 구조를 명확히 정의합니다. Claude Code, Cursor, Codex 등 다양한 AI 개발 도구와 호환되며, `.claude/tidy.json` 설정 파일을 통해 각 디렉토리의 용도를 명시하고, 훅(Hook)을 사용하여 새로운 파일 생성 시 실시간으로 규칙을 적용합니다. 또한, 기존 프로젝트를 정리하는 완전한 워크플로우(패턴 2)를 제공하여, 파이썬 스크립트(`audit.py`, `refs.py`)를 사용하여 파일 사용 현황을 분석하고, 사용자 확인을 거쳐 파일 이동, 이름 변경, 삭제, 무시 등의 작업을 수행합니다. 이 과정에서 생성된 출력물, 임시 스크립트, 불필요한 백업 파일 등을 자동으로 식별하고 `.gitignore`에 추가하여 버전 관리에서 제외합니다. 최종적으로 정리된 상태를 `audit.py --init` 명령어로 디렉토리 규칙으로 고정하여 이후 모든 세션에서 일관된 규칙을 유지할 수 있도록 합니다.

지원 대상✓Claude Code✓Codex CLI✓Cursor
npx skills add https://github.com/GaoFei2025-0314/tidy/tree/HEAD/skills/tidy

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

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

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

문서

Tidy · 프로젝트 정리 규칙은(는) 무엇을 하나요?

저장소의 모든 파일은 다음 세 질문에 답할 수 있어야 합니다:

  1. 왜 존재하는가? (필요성) — 삭제하면 무엇이 망가집니까?
  2. 왜 여기 있는가? (소속) — 이 프로젝트의 디렉토리 규칙에 따르면 어떤 디렉토리에 속합니까?
  3. 다른 사람이 이해할 수 있는가? (가독성) — 파일 이름과 README만 봐도 새 개발자가 이 파일이 무엇을 하는지 알 수 있습니까?

사용자가 /tidy를 입력하면 바로 아래 "패턴 2: 기존 프로젝트 정리"를 실행합니다.

세 단계 메커니즘

단계역할실행 주체
디렉토리 규칙 .claude/tidy.json각 최상위 디렉토리에 무엇을 넣을지 선언하여, "어디에 넣을지"를 판단이 아닌 조회로 변경프로젝트 정리 시 생성하고 이후 유지보수
Hooks (플러그인 설치 시 함께 설치)세션 시작 시 규칙과 디렉토리 규칙 주입; 규칙에 맞지 않는 새 파일 차단; 각 턴 종료 시 새 파일 검사자동, 아래 "Hook 프롬프트 수신 시" 참조
본 스킬코드 작성 시 판단 기준, 기존 프로젝트 정리 워크플로우사용자

Hooks는 새로 추가된 파일만 검사하며, 기존 프로젝트의 문제는 "패턴 2"로 정리합니다.

세 가지 검사 수준

시점수행 작업
새 파일 생성 시아래 4가지 질문 검토 (Hooks가 있으면 자동 차단)
단계 완료 / 작업 종료 시audit.py <루트> --changed (git 프로젝트, HEAD 기준 변경사항만) 또는 --since 2h (수정 시간 기준, git 프로젝트가 아니어도 사용 가능). Hooks가 없는 도구(Codex, Cursor)는 매 작업 완료 전에 한 번씩 실행합니다.
사용자가 프로젝트 정리 요청 시전체 audit.py <루트>, "패턴 2" 수행

확인 후 처리할 필요가 없는 경고(의도된 배포본, 서드파티 파일명)는 audit.py <루트> --review <규칙> <경로> --reason <결론>으로 기록하여 이후 보고하지 않습니다. 파일 내용이 변경되면 다시 나타나 재검토를 알립니다.


패턴 1: 코드 작성 시 (매번 적용)

새 파일 생성 전 4가지 질문

질문통과하지 못할 경우
필요한가? 기존 파일에 포함할 수 있는가? 일회성인가?기존 파일에 병합; 일회성 내용은 응답에만 작성하고 파일로 저장하지 않음
어디에 넣을까? .claude/tidy.json의 layout과 일치하는가?이미 선언된 디렉토리에 배치; 새 최상위 디렉토리가 정말 필요하다면 layout과 README "디렉토리 구조"에 먼저 등록
이름은 무엇으로? 이름이 용도를 설명하고 같은 디렉토리의 스타일과 일관된가?references/naming.md 규칙에 따라 이름 지정
커밋해야 하는가? 생성물, 의존성, 비밀키, 대용량 파일인가?.gitignore에 추가하여 버전 관리에서 제외

AI의 가장 흔한 나쁜 습관 (금지)

❌ 나쁜 습관✅ 올바른 방법
루트 디렉토리에 test.py, debug.js, check_xxx.py 임시 스크립트 작성.scratch/ (반드시 .gitignore에 등록) 또는 시스템 임시 디렉토리에 작성하고 작업 종료 후 삭제
foo_v2.ts, foo_new.ts, foo.backup.ts, foo_old/ 복사본 생성원본 파일을 직접 수정하고, 이력은 git에 맡김
작업 완료 시마다 IMPLEMENTATION_SUMMARY.md, FIX_REPORT.md 생성요약은 응답과 커밋 메시지에 작성; 장기 지식은 README 또는 docs/ 기존 문서에 병합
build/, out/, dist/, 렌더링된 비디오/오디오, 로그 파일 커밋.gitignore에 추가; README에 생성 방법 명시
node_modules/, .venv/ 커밋 또는 여기저기 흩어짐무시; 다중 언어 도구체인은 각각 제자리에 (structure.md "혼합 프로젝트" 참조)
한글, 공백, 괄호 파일명: 프롬프트 공유.md, final (1).mp4파일명은 영문 kebab-case 사용, 한글은 파일 제목에만 사용
스캐폴딩 샘플 정리하지 않음, 대량 주석 처리된 오래된 코드, 사용하지 않는 의존성참조 없음 확인 후 삭제
동일한 설정을 두 곳에 작성 (.prettierrc + package.json#prettier)한 곳에만 유지
"나중에 쓸 수도 있으니까" 미리 빈 디렉토리, 빈 파일 생성필요할 때 생성

Hook 프롬프트 수신 시

  • 새 파일 생성이 차단된 경우: 프롬프트에 따라 방법 변경 — 기존 파일에 병합, 디렉토리 변경, 이름 변경, 또는 아예 파일로 저장하지 않음. 차단을 우회하기 위해 Bash로 파일을 작성하지 마십시오 (Stop 검사에서 발견됩니다).
  • 종료 전 검사에서 문제가 나열된 경우: 하나씩 처리 (임시 파일 삭제, 복사본 병합, 이동, .gitignore 보충) 후 종료.
  • 사용자가 명시적으로 요청한 경우 (예: 한글 파일명을 원하는 경우): 규칙에 따라 경로를 .claude/tidy.json의 allow에 추가 (예: {"non-portable-name": ["docs/강의/**"]}) 하고 응답에 설명. 예외 범위는 최소화하고, disable로 전체 규칙을 끄지 말며, 임의로 예외를 추가하지 마십시오.
  • 로컬에는 남기되 git에 넣지 않아야 할 파일 (완성본, 검수 완료된 더빙, 모델 가중치 등): keepLocal에 등록하고 이유를 명시한 후 .gitignore에 추가. 삭제하지 마십시오.
  • 새 최상위 디렉토리가 필요한 경우: 먼저 적절한 기존 디렉토리가 없는지 확인한 후, layout과 README "디렉토리 구조"에 등록.

패턴 2: 기존 프로젝트 정리

스크립트는 본 스킬의 scripts/ 디렉토리에 있으며, Python 3.9+ 표준 라이브러리만 필요합니다.

1단계: 스캔

python3 <skill>/scripts/audit.py <프로젝트 루트>            # 텍스트 보고서
python3 <skill>/scripts/audit.py <프로젝트 루트> --format json

2단계: 프로젝트 이해 및 참조 확인

스크립트는 휴리스틱 방식이므로 각 경고를 확인한 후 처리해야 합니다. 텍스트 보고서는 개수가 많은 동일 유형 문제를 접지만, 개별 확인이 필요하면 --all을 추가하세요. 결론을 내리기 전에:

  • README, package.json / pyproject.toml의 scripts와 진입점을 읽으십시오.

  • 삭제하거나 이동하려는 각 파일의 참조를 확인하십시오:

    python3 <skill>/scripts/refs.py <프로젝트 루트> <파일> [<파일> ...]
    

    결과는 네 가지: in-use (명확한 참조), convention (프레임워크가 규칙에 따라 로드), maybe (약한 일치만 있음), unreferenced (찾을 수 없음). unreferenced의 경우에도 동적 경로와 외부 호출을 고려해야 하며, 판단 기준은 references/file-necessity.md를 참조하십시오.

3단계: 정리 계획 제시 및 확인 대기

경로작업대상 위치이유
프롬프트 공유.md이동+이름 변경docs/prompts.md루트에 문서 흩어짐; ASCII가 아닌 파일명
out/무시—렌더링 산출물, npm run render로 재생성 가능
src/Root_old.tsx삭제—refs.py: unreferenced; Root.tsx와 내용 동일

작업은 일곱 가지뿐입니다: 보존 / 이동 / 이름 변경 / 삭제 / 보관 / 무시 / 로컬 보존 (무시하되 삭제하지 않고, keepLocal에 등록). 확실하지 않으면 "확인 대기"로 표시합니다. 경고가 예상되는 경우(배포본, 연속 프레임 캡처)라면 작업은 규칙에 따라 allow를 추가하는 것이지 파일을 삭제하는 것이 아닙니다.

삭제와 대량 이동은 반드시 사용자 확인을 받아야 합니다. 계획이 확인되기 전에 파일을 변경하지 마십시오.

4단계: 실행

  1. 작업 공간이 깨끗한지 확인; git 저장소가 아니면 git init을 제안하고 초기 커밋을 스냅샷으로 수행.
  2. python3 <skill>/scripts/audit.py <루트> --fix-gitignore: 무시되지 않은 의존성, 생성물, 쓰레기 파일, 비밀키를 .gitignore에 자동으로 추가 (추가만 하고 삭제는 하지 않음). 이미 git이 추적 중인 파일은 나열되며 git rm --cached가 필요합니다.
  3. 이동 / 이름 변경은 git mv 사용; 이후 이전 경로에 대해 refs.py 또는 grep을 실행하여 모든 참조(import, staticFile(), 설정, 스크립트, 문서 링크)를 수정.
  4. 빌드 / 테스트 / lint를 실행하여 손상된 부분이 없는지 확인.
  5. 구조 조정과 코드 수정은 별도의 커밋으로 분리.

5단계: 디렉토리 규칙 확정 (건너뛰지 마십시오)

정리가 완료되면 디렉토리 규칙을 생성하여 이후 모든 세션이 자동으로 따르도록 합니다:

python3 <skill>/scripts/audit.py <루트> --init     # 현재 최상위 디렉토리를 기반으로 .claude/tidy.json 초안 생성

그런 다음 각 디렉토리의 설명을 완성 (TODO 대체)하되, 배치 결정을 안내할 수 있도록 작성하십시오. 예를 들어 "public/": "staticFile()이 읽는素材: 이미지, 폰트, 더빙"처럼 써야지, 그냥 "정적 리소스"라고만 쓰지 마십시오. README "디렉토리 구조"도 동시에 업데이트하십시오. 설정 형식은 references/config.md를 참조하십시오.

안전 기준

  • 재생성 불가능한 파일 (사용자 소스, 녹음, 수제 프롬프트, 데이터)은 확인 없이 절대 삭제하지 않음 — 적절한 디렉토리로 이동하거나 보관.
  • .env 등 비밀키 내용을 읽거나 출력하지 않음; 비밀키가 이미 git에 추적되고 있음을 발견하면 사용자에게 키 교체와 이력 정리를 알리고, 단순히 파일만 삭제하지는 않음.
  • 파일이 사용 중인지 확실하지 않으면 "확인 대기"로 표시하고 추측하지 않음.

삭제 vs 보관?

'git에 넣을지'와 '삭제할지'는 별도로 판단합니다.

이 파일...
├─ 저렴하게 재생성할 수 있습니까? (빌드 산출물, 캐시, 로그, 의존성, 임시 프레임)
│    └─ 예 → 삭제 + .gitignore에 추가
├─ 재생성 가능하지만 비용이 높습니까? (완성본, 검수 완료 더빙, 렌더링된 강의 패키지, 훈련된 모델 — 시간, 비용 또는 재검수 필요)
│    └─ 예 → 로컬 보존 + .gitignore에 추가 + tidy.json의 keepLocal에 등록 (이유 명시), README에 생성 방법 명시
├─ git이 이미 추적 중인 오래된 코드입니까?
│    └─ 예 → 바로 삭제 (git 이력이 보관 역할)
├─ 재생성 불가능하지만 참고 가치가 있습니까? (조사 노트, 예전 프롬프트, 디자인 시안, 의사 결정 기록)
│    └─ 예 → docs/archive/로 이동, 파일명에 날짜 접두사 추가, docs/archive/README.md에 이유 한 줄 기록
├─ 대용량 소스입니까? (오디오/비디오, 데이터세트, 모델)
│    └─ 예 → git에 넣지 않음 (또는 Git LFS 사용), README에 획득 방법 명시
└─ 재생성 불가능하고 가치도 없음 → 목록 작성 후 사용자 확인 후 삭제

보관 세부 규칙은 references/docs.md를 참조하십시오.

참조 파일

파일내용언제 읽을까
references/structure.md최상위 디렉토리 화이트리스트, 다양한 프로젝트 유형의 표준 디렉토리 레이아웃 (Node/TS, Remotion, Python, 혼합 프로젝트)파일 위치 결정, layout 설계 시
references/file-necessity.md파일 필요성 판단, 일반적인 삭제 가능 샘플삭제 가능 여부 판단 시
references/naming.md각 언어의 명명 규칙, 금지된 명명 패턴새 파일 생성 또는 이름 변경 시
references/docs.mdREADME 최소 요구사항, docs/ 레이아웃, 보관 규칙문서 작성, 보관 시
references/config.md.claude/tidy.json 필드 설명과 예시디렉토리 규칙 생성 또는 수정 시
assets/README.template.mdREADME 템플릿프로젝트에 README가 없을 때
assets/gitignore/.gitignore 조각: 일반, Node, Python, 미디어무시 규칙 보충 시
assets/agents-rules.mdAGENTS.md에 붙여넣을 수 있는 규칙 (Hooks를 지원하지 않는 다른 AI 도구용)프로젝트가 Cursor / Codex 등도 사용할 때

관련 스킬