Community생산성 & 협업github.com

세션 정리

Git 저장소와 머신의 세션 종료 감사 및 안전한 정리입니다. 추적되지 않은 파일, 푸시되지 않은 커밋, 스태시, 임시 파일, 백그라운드 프로세스 등 증명 가능한 오래된 항목만 제거하고, 작업 손실 가능성이 있는 항목은 사용자에게 문의합니다.

세션 정리란 무엇인가요?

이 스킬은 AI 에이전트가 세션 종료 시 Git 저장소와 시스템의 상태를 종합적으로 감사하고 안전하게 정리하는 방법을 제공합니다. Claude Code, Codex, Cursor 등 다양한 AI 코딩 도구와 호환되며, `/lanes` 하네스와 통합되어 작동할 수 있습니다. 스킬은 3단계로 구성됩니다: 1) 읽기 전용 감사(감사 스크립트 실행, 대화 추적 분석, 배포 상태 확인 등), 2) 각 발견 항목 분류(AUTO-CLEAN: 안전하고 복구 가능한 항목 자동 정리, ASK: 사용자 승인 필요, REPORT ONLY: 정보 제공), 3) 구조화된 보고서 생성. 안전 규칙을 엄격히 적용하여 병합되지 않은 커밋, 더티 워크트리, 스태시 등은 절대 자동 삭제하지 않으며, 사용자 승인 후에도 복구 가능하도록 증거를 기록합니다. 특히 `CLAUDE_CODE_SESSION_ID`를 활용한 프로세스 소유권 추적, 타임스탬프와 대화 기록을 교차 검증하는 방식으로 세션 단위 정확성을 보장합니다. 리팩토링, 린트 수정, 데드코드 제거 등은 이 스킬의 범위를 벗어납니다.

지원 대상✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/thebpandey/session-cleanup/tree/HEAD

Installed? Explore more 생산성 & 협업 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

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

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

문서

세션 정리은(는) 무엇을 하나요?

먼저 감사하고, 그 다음에 삭제하며, 대상 검사 후에만 삭제합니다. 목표는 소유자가 아무것도 실행 중이지 않고, 아무것도 손실되지 않았으며, 오래된 항목이 남겨지지 않았다는 것을 확인하고 세션을 떠날 수 있도록 하는 것입니다. 놓친 남은 항목은 대가가 적지만, 푸시되지 않은 커밋을 삭제하는 것은 그렇지 않습니다. 확실하지 않은 경우, 발견 항목은 ASK로 분류하고 절대 AUTO-CLEAN으로 분류하지 않습니다.

모든 Git 저장소에서 작동합니다. Lanes 하네스, Beads 및 Vercel 부분은 해당 항목이 존재할 때만 활성화되며, 그렇지 않으면 자동으로 건너뜁니다.

1단계: 감사 (읽기 전용)

저장소(모든 워크트리)에서 번들 감사 스크립트를 실행합니다. 운영 체제에 맞는 스크립트를 사용하십시오. 스킬 폴더는 ~/.claude/skills/, ~/.codex/skills/ 또는 ~/.agents/skills/ 아래에 있을 수 있습니다:

# Linux 및 macOS
bash <skill-dir>/scripts/audit.sh                 # 오프라인 시 --no-fetch 추가
# Windows (PowerShell 5.1 또는 7)
powershell -NoProfile -ExecutionPolicy Bypass -File <skill-dir>\scripts\audit.ps1   # 오프라인 시 -NoFetch 추가

두 스크립트 모두 영역당 하나의 섹션(CONTEXT, WORKING_TREE, SYNC, WORKTREES, BRANCHES, STASHES, LANES, PROCESSES, ARTIFACTS, TRACKER, DEPLOY, SESSION_LOG)을 출력합니다. 유일한 쓰기 작업은 일반 git fetch입니다(--prune 절대 사용 안 함). .env 파일을 읽거나 프로세스 환경을 출력하지 않습니다.

"이 세션"을 결정하는 방법 (모든 분류에 중요):

  • 프로세스: owner=this_session은 이 세션(또는 이 세션이 시작한 것)이 프로세스를 시작했음을 의미합니다. Linux에서는 상속된 CLAUDE_CODE_SESSION_ID로 증명되며, 이는 nohup 이후에도 유지됩니다. macOS와 Windows는 다른 프로세스의 환경을 숨기므로, 이는 "Claude 프로세스의 하위 프로세스"(CLAUDE_PID)를 의미합니다. 분리되어 다시 부모가 지정된 프로세스는 대신 started_during_session으로 표시되며, 이 대화에서 추적할 수 없는 경우 ASK입니다. owner=harness_do_not_kill은 Claude Code 자체의 MCP 서버 및 플러그인입니다: 절대 건드리지 마십시오. other_session_or_user는 다른 사용자의 것입니다.
  • 파일, 브랜치, 스태시: this_session / pre_session은 타임스탬프를 session_start(이 세션 대화록의 첫 번째 타임스탬프)와 비교합니다. 타임스탬프는 힌트일 뿐 증거는 아닙니다: 세션 기간 동안 생성된 항목이 병렬 세션에서 왔을 수 있습니다. 타임스탬프가 그렇다고 말하고 그리고 이 대화에서 추적할 수 있을 때만(항목을 생성한 명령을 실행한 경우) 이 세션의 항목으로 취급합니다. 그렇지 않으면 ASK입니다.

Claude Code 외부(예: Codex)에서는 CLAUDE_CODE_SESSION_ID 또는 CLAUDE_PID가 없으므로 session_id는 unknown이고 모든 항목은 pre_session으로 태그되며 프로세스는 in_repo로만 일치됩니다. 세션 시작 시간을 알고 있으면 --since <ISO 시간>(Windows에서는 -Since)을 전달하고, 그렇지 않으면 이 대화의 명령으로 추적할 수 없는 한 파일과 프로세스를 ASK로 취급합니다.

그런 다음 스크립트가 볼 수 없는 격차를 가능한 병렬로 채웁니다:

  1. 자신의 백그라운드 작업. 이 대화에서 시작했고 여전히 실행 중인 백그라운드 Bash 작업, 모니터, 하위 에이전트 및 예약된 웨이크업을 나열합니다. 완료되었거나 유휴 상태인 것은 시작한 도구(TaskStop, Monitor stop 등)로 중지합니다.
  2. 요청 남은 항목. 대화에서 소유자가 나중에 삭제하거나 임시로만 유지하도록 요청한 항목(업로드 폴더, 디버그 플래그, 테스트 계정, 임시 파일)을 검색합니다. 여전히 존재하는지 확인합니다.
  3. 배포 상태 (DEPLOY에 플랫폼이 표시된 경우에만). 최신 프로덕션 배포의 커밋 SHA를 가져와 main_tip과 비교합니다. Vercel의 경우: vercel ls --prod로 최신 프로덕션 배포를 찾은 다음 vercel inspect <url>(또는 Vercel MCP / 대시보드)로 Git 커밋을 확인합니다. SHA를 얻을 수 없으면 이유와 함께 "deploy: unverified"를 보고합니다. 타임스탬프에서 일치를 유추하지 마십시오.
  4. 저장소 외부의 세션이 건드린 모든 것(다른 저장소의 워크트리, 전역 설치). 보고하되 수정하지 마십시오.

2단계: 각 발견 항목 분류

AUTO-CLEAN (안전하고 복구 가능; 실행 후 보고):

  • main에 완전히 병합된 로컬 브랜치(git branch -d, 절대 -D 사용 안 함), main, 현재 브랜치 및 워크트리에서 체크아웃된 브랜치 제외.
  • 폴더가 이미 사라진 정리 가능한 워크트리 레코드(git worktree prune).
  • 브랜치가 main에 병합되었고 앞선 커밋이 없는 이 저장소 내 정리된 연결된 워크트리(git worktree remove <path>, --force 없음, 그런 다음 git branch -d). Lanes 하네스가 소유한 경우 대신 하네스 스크립트를 사용하십시오(아래 참조).
  • 해당 레인 또는 브랜치가 더 이상 존재하지 않고 열린 프로세스가 없는 임시 폴더(open_handles=0; 삭제 직전에 lsof +D <dir>로 재확인).
  • owner=this_session이며 이 대화에서 추적할 수 있고 유휴 상태이거나 더 이상 필요하지 않은 프로세스(dev 서버, 감시자, 헤드리스 브라우저). PID로만 종료합니다(Linux/macOS에서는 kill <pid>, Windows에서는 Stop-Process -Id <pid>).
  • Git에서 무시되는 오래된 빌드 유형 캐시(.next/types, .next/dev/types). 다음 빌드에서 재생성됩니다.
  • 이 세션의 스크래치패드 폴더에 있는 자체 스크래치 파일 및 저장소의 추적되지 않은 정크(*.orig, *.rej, 유휴 로그)로, this_session 이고 사용자가 실행한 명령으로 추적 가능한 것.

ASK (작업 손실 가능성 있음, 또는 이 세션의 것으로 증명 불가능):

  • 병합되지 않은 브랜치 또는 main에 없는 커밋. PATCHES_ALREADY_IN_main으로 표시된 브랜치는 스쿼시 또는 리베이스 병합되었을 가능성이 높습니다: 그렇게 말하되, -D 전에 여전히 물어보십시오.
  • 더티 워크트리(dirty_files > 0), 스태시, 증거로 필요할 수 있는 coverage/ 및 test-results/.
  • other_session_or_user 또는 started_during_session 프로세스 및 추적할 수 없는 모든 프로세스.
  • 모든 pre_session 항목 및 사용자가 생성하지 않은 모든 추적되지 않은 파일.

REPORT ONLY (소유자가 조치하거나 정보 제공):

  • main과 origin 간의 차이(푸시되지 않았거나 뒤쳐짐). 푸시 또는 풀을 권장하되 정리 작업의 일부로 수행하지 마십시오.
  • 배포 불일치 또는 "unverified" 배포 상태.
  • 활성 작업이 없는 열린 추적기 항목(beads in_progress, tasks.md WIP) 및 작업이 아직 열려 있는 완료된 작업. 항목 이름과 발견한 내용을 명시하십시오.
  • 이 저장소 외부의 워크트리 또는 폴더 및 고유 커밋이 아직 있는 upstream_gone 브랜치.

안전 규칙

재생성할 수 없는 작업을 보호합니다. 각 규칙은 명백한 지름길이 이전에 작업을 파괴했기 때문에 존재합니다.

  • 삭제 전 검사. 각 폴더에 대해 내용과 크기를 먼저 나열하십시오. 각 브랜치에 대해 먼저 git log --oneline main..<branch>를 표시하십시오. 그 증거를 보고서에 포함하십시오.
  • 이 대화에서 소유자의 명시적 승인 없이 병합되지 않은 커밋, 더티 워크트리 또는 스태시를 절대 삭제하지 마십시오. 한 항목에 대한 승인이 다음 항목을 포함하지 않습니다.
  • PID로만 프로세스를 종료하고, owner=this_session이고 사용자가 시작했음을 확인한 후에만 수행하십시오. 절대 pkill, killall, 첫 시도에 kill -9를 사용하거나 포트만으로 종료하지 마십시오.
  • 절대 베어 git stash, git reset --hard, git clean -fdx(또는 모든 git clean -f) 또는 글로브와 함께 rm -rf를 사용하지 마십시오. 이러한 작업은 실행 취소가 불가능합니다. 명명된 경로를 한 번에 하나씩 삭제하십시오.
  • git branch -D, git stash drop 및 git worktree remove --force는 소유자가 승인한 단일 항목에 대해서만, 잃을 것이 무엇인지(커밋, diff stat) 보여준 후에 실행하십시오. 복원할 수 있도록 브랜치 팁 SHA를 보고서에 기록하십시오.
  • .env 파일, 키 또는 자격 증명을 절대 읽거나, 인쇄하거나, 이동하거나 삭제하지 마십시오. 정크처럼 보이더라도 경로로만 보고하십시오.
  • 이 저장소 내에 머무르십시오. 다른 앱의 워크트리, 분리된 체크아웃 또는 공유 /tmp 폴더는 보고만 하고 건드리지 마십시오. /tmp에서 글로브 삭제를 절대 수행하지 마십시오.
  • 절대 harness_do_not_kill 프로세스 또는 Claude 프로세스 자체를 종료하지 마십시오.

Lanes 하네스가 있는 경우

LANES 섹션에 상태 디렉토리가 표시되는 경우에만 해당합니다. 그렇지 않으면 이 블록을 건너뜁니다.

  • 레인 워크트리, 레인 임시 디렉토리, 릴레이 작업 디렉토리 및 lanes.tsv 행을 하네스 자체 스크립트로 제거하고 rm으로 절대 제거하지 마십시오: 병합된 레인의 경우 bash ~/.claude/skills/lanes/lane/cleanup.sh <lane-dir> <branch>를 실행한 다음 bash ~/.claude/skills/lanes/lane/cleanup.sh --sweep을 실행하십시오. 메인 워크트리에서 실행하십시오.
  • WORKTREE_MISSING 및 BRANCH_MERGED 행은 스윕을 통해 처리됩니다. 병합되지 않은 레인의 행은 ASK입니다.
  • 여전히 실행 중인 릴레이 작업(rc 파일 없음)은 REPORT ONLY입니다. Lanes 감시자가 소유합니다.
  • /lanes 세션에서 메인 레인이 통합됩니다. 작업이 아직 origin/main에 병합되지 않은 레인 브랜치를 삭제하지 마십시오.

하네스가 없으면 .claude/worktrees/ 아래의 워크트리(예: Claude Code의 EnterWorktree에서)는 위의 일반 Git 규칙을 따릅니다.

3단계: 보고서

정확히 이 구조를 사용하십시오. 훑어보기 쉽게 유지하십시오. 소유자가 긴 세션 끝에 읽습니다.

## 세션 정리

**이미 정리됨:** 작업 트리, 동기화, 워크트리, 브랜치, 스태시, 프로세스, 아티팩트, 추적기, 배포
(통과한 영역만 나열)

**정리됨**
- `feat/login-form` 브랜치: a1b2c3d에서 main에 병합됨, 앞선 커밋 0개. `git branch -d`로 삭제됨(복원: `git branch feat/login-form a1b2c3d`).
- `python3 -m http.server 3000` (PID 170308): 이 세션에서 미리보기용으로 시작, 유휴 상태. 중지됨.
- `.next/types` (1.2M): git 무시됨, 빌드 시 재생성됨.

**결정 필요**
- `feat/wip` 브랜치: main에 없는 커밋 1개("wip: draft parser"), 마지막 커밋 2시간 전, 연결된 작업 bd-42 in_progress.
  재개(유지) 또는 폐기(`git branch -D feat/wip`)?
- `stash@{0}` "On main: sc test stash", 5일 전. 적용 또는 삭제?

**보고 전용**
- main이 origin/main보다 2커밋 앞서 있음(푸시되지 않음). 푸시 권장.
- 프로덕션 배포: 확인되지 않음(vercel CLI에 로그인되지 않음).

**다음 작업**
- `git worktree list` 실행, 메인 워크트리만 예상.
- `git status --short` 실행, 출력 없음 예상.

보고서 규칙:

  • 모든 "정리됨" 줄은 무엇인지, 크기(파일 및 폴더의 경우) 및 안전한 이유를 명시합니다. 브랜치의 경우 복원할 수 있도록 팁 SHA를 포함하십시오.
  • 모든 "결정 필요" 항목은 결정에 필요한 사실(기간, 커밋 수, 커밋 제목, 연결된 작업)과 두 가지 구체적인 옵션을 제공합니다.
  • 감사 또는 이 세션의 명령이 표시하지 않는 한 영역이 깨끗하다고 말하지 마십시오. 검사가 건너뛰어진 경우(오프라인, CLI 누락, 권한 없음) 보고 전용 아래에 명시하십시오.
  • 다음 작업에는 항상 예상 출력과 함께 하나 이상의 확인 명령이 포함됩니다.

소유자가 ASK 항목에 응답한 후, 정확히 승인한 대로 수행하고 관련 감사 섹션을 다시 실행한 후 결과를 보고하십시오.

로깅

저장소에 세션 로그 폴더가 있는 경우(SESSION_LOG에 _sessions/ 또는 유사한 항목 표시), 짧은 정리 항목(날짜, 정리된 내용, 소유자를 기다리는 내용)을 추가하십시오. 프로젝트 규칙에서 세션 로그 커밋을 허용하는 경우에만 커밋하십시오. CLAUDE.md 또는 폴더의 무시 상태를 확인하십시오(ignored=yes는 커밋하지 않음을 의미).

범위 외

리팩토링, 린트 수정, 데드코드 제거 및 종속성 업그레이드는 범위를 벗어납니다. 발견하면 백로그 항목(메모리 또는 추적기)으로 기록하고 한 줄로 언급하십시오. 푸시, 풀 및 배포도 범위를 벗어납니다: 권장만 하고 수행하지 마십시오.

관련 스킬