---
name: memory-save
description: Save current session context and generate a handoff prompt for continuing in a new session. Use when the user says "memory-save", "세션 저장", "정리해줘", "context 저장", or when context usage is high and work needs to be preserved before compact or /clear. Also supports incremental saving during work.
model: sonnet
---

# Session Context Save

세션의 전체 맥락을 상세하게 저장하여, 새로운 세션에서 손실 없이 작업을 이어갈 수 있도록 한다.
**핵심 원칙: 새 세션의 Claude가 이 문서만 읽고 추가 질문 없이 작업을 재개할 수 있어야 한다.**

---

## Incremental Save (중간 저장) — 능동적으로 실행

컨텍스트가 가득 차면 memory-save 자체를 실행할 수 없다. 이를 방지하기 위해 **작업 중 자동으로 중간 저장**한다.

### 트리거 조건 (아래 중 하나라도 해당하면 중간 저장 실행)

- 주요 작업 단계가 완료되었을 때 (빌드 성공, 테스트 통과, 기능 구현 완료 등)
- 이미지를 3장 이상 읽었을 때
- 시행착오 끝에 해결책을 찾았을 때 (실패→성공 전환 시점)
- 대화가 길어지고 있다고 판단될 때

### 중간 저장 동작

1. `{PROJECT_ROOT}/.omc/sessions/{YYYY-MM-DD}_{topic-slug}.md` 파일이 이미 있으면 append, 없으면 생성
2. 아래 형식으로 해당 단계만 추가:

```markdown
---
### {N}단계: {단계명} ({HH:MM})
- 수행한 작업: ...
- 결과: 성공/실패
- 핵심 발견: ...
- 변경된 파일: ...
---
```

3. `.omc/project-summary.md`도 현재 상태로 갱신
4. 출력은 한 줄만: `[incremental save] {단계명} → .omc/sessions/{filename}`
5. **사용자에게 묻지 않고 자동으로 실행** — 작업 흐름을 끊지 않는다

### 중간 저장의 핵심 가치

```
이미지 과다 → compact 필요 → compact 하면 맥락 손실
                                  ↓
              하지만 .omc/sessions/ 파일에 이미 상세 기록 있음 → 손실 없음
```

---

## Full Save (전체 저장) — /memory-save 호출 시 실행

### Step 0: 프로젝트 루트 감지

세션 파일은 반드시 **프로젝트 루트**의 `.omc/sessions/`에 저장한다. cwd가 프로젝트 루트가 아닐 수 있으므로 아래 순서로 감지:
1. `package.json`, `Cargo.toml`, `go.mod`, `pyproject.toml`, `.git/` 중 하나가 있는 가장 가까운 상위 디렉토리
2. 대화에서 주로 작업한 프로젝트 경로
3. 위 모두 해당 없으면 cwd 사용

감지한 프로젝트 루트를 `{PROJECT_ROOT}`로 사용한다. 이후 모든 `.omc/` 경로는 `{PROJECT_ROOT}/.omc/`를 의미한다.

### Step 1: 자동 수집 (도구 실행 — 기억이 아닌 증거 기반)

아래 명령어를 **반드시 실행**하고 결과를 수집한다. 실패하는 명령은 건너뛴다:

```bash
# 프로젝트 파일 상태
git log --oneline -15 2>/dev/null
git diff --stat 2>/dev/null
git diff --name-only HEAD 2>/dev/null
git stash list 2>/dev/null
git ls-files --others --exclude-standard 2>/dev/null

# git 없는 프로젝트용 fallback
find . -maxdepth 3 -type f -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -newer .omc/sessions/ 2>/dev/null | head -30

# OMC 상태
cat .omc/notepad.md 2>/dev/null
cat .omc/project-summary.md 2>/dev/null
```

그 다음, 대화에서 아래 정보를 추출한다 (incremental save로 이미 기록된 내용이 있으면 그 파일을 읽고 병합):
- 사용자가 원래 요청한 것 (원문 그대로)
- 시간순 진행 과정과 각 단계의 결과
- 시도한 접근법과 실패 이유 (시행착오 포함)
- 최종 아키텍처와 설계 결정의 근거
- 현재 동작하는 것 / 안 되는 것
- 알려진 제한사항과 주의점

### Step 2: 세션 파일 저장

`.omc/sessions/{YYYY-MM-DD}_{topic-slug}.md`에 아래 형식으로 저장 (incremental save 내용이 있으면 병합하여 완전한 문서로 재구성):

```markdown
# Session: {구체적 주제}
Date: {YYYY-MM-DD}
Project: {cwd}

## 배경 및 목표
- 사용자의 원래 요청 (원문)
- 달성하려는 최종 목표

## 진행 과정 (시간순)

### 1단계: {단계명}
- 수행한 작업
- 결과 (성공/실패)
- 실패 시: 원인과 교훈

### 2단계: {단계명}
...

## 시도한 접근법과 결과
| 접근법 | 결과 | 원인 |
|--------|------|------|
| ... | 성공/실패 | ... |

## 최종 아키텍처
- 전체 구조와 데이터 흐름
- 핵심 기술 스택
- 설계 결정의 근거

## 핵심 파일과 역할
| 파일 | 역할 | 주요 내용 |
|------|------|----------|
| ... | ... | ... |

## 설정 및 환경
- .env 내용 (시크릿은 마스킹: `API_KEY=sk-****`)
- 설치된 주요 패키지
- 실행에 필요한 외부 의존성

## 사용법 (실행 가능한 명령어)
```bash
# 셋업 (1회)
...
# 실행
...
# 코드에서 사용
import ...
```

## 현재 상태
### 동작하는 것
- (테스트 결과 포함)
### 동작하지 않는 것 / 제한사항
- ...
### 실행 중인 프로세스
- ...

## 다음 단계
1. {구체적 작업 + 실행 명령어}
2. ...

## 핵심 코드 스니펫
(새 세션에서 바로 참조할 수 있는 패턴/설정 인라인)

## Handoff Prompt
(Step 3에서 생성)
```

### Step 2b: 구버전 정리 + 세션 이력 관리

**구버전 정리**: 같은 주제의 세션 파일이 **다른 경로**(상위 폴더의 `.omc/sessions/` 등)에 존재하면 삭제한다. 세션 파일은 `{PROJECT_ROOT}/.omc/sessions/`에만 존재해야 한다.

**세션 이력 관리**: 같은 프로젝트에 이전 세션 파일이 이미 존재하면:
- 파일명에 날짜가 다르면 → 이전 세션은 유지 (별개 작업일)
- 파일명에 날짜가 같고 주제가 같으면 → 이전 파일 덮어쓰기 (같은 날 이어가기)
- 새 세션 파일 상단에 `이전 세션: {이전 파일명}` 링크를 추가하여 연결고리 유지

### Step 3: 프로젝트 요약 + 핸드오프 프롬프트 생성

**3a. 프로젝트 요약 저장** — `.omc/project-summary.md`에 5줄 이내로 프로젝트 현재 상태 요약 저장 (기존 내용 덮어쓰기):

```markdown
# {프로젝트명}
- 목적: {한 줄}
- 기술: {스택}
- 상태: {동작하는 것 요약}
- 제한: {주요 제한사항}
- 마지막 작업: {날짜} — {내용}
```

**3b. 핸드오프 프롬프트 생성** — 아래 필수 항목을 모두 포함하여 생성한다. 첫 줄에 `SESSION_NAME: {현재 세션명}`을 반드시 포함시킨다 (세션명은 사용자에게 묻거나, 직전 `/rename` 인자, 또는 topic-slug에서 추론).

```
SESSION_NAME: {현재 세션명}

이전 세션 맥락:
  cat .omc/sessions/{filename}
  cat .omc/project-summary.md

이어서 할 작업: {구체적 작업 설명}
첫 번째 행동: {새 세션에서 즉시 실행할 명령어 또는 행동 1개}
작업 중이던 파일: {파일:라인 또는 파일 목록}
현재 에러/이슈: {있으면 에러 메시지 원문, 없으면 "없음"}
실행에 필요한 사전 조건: {서버 실행, Chrome 시작 등}
관련 파일: {핵심 파일 3-5개}
```

생성한 프롬프트는 **두 곳에 동시 저장**한다:
1. **클립보드 복사** (macOS: `pbcopy`, Linux: `xclip -selection clipboard` 또는 `xsel --clipboard`, 실패 시 건너뜀)
2. **`{PROJECT_ROOT}/.omc/.handoff-pending` 파일에 저장** — SessionStart hook이 이 파일을 읽어 새 세션에 자동 주입하고 세션명을 복원한다. 파일 형식은 위 프롬프트 그대로.

### Step 4: 자동 검증 + 출력

저장 후 아래 항목을 자동 검증한다. 문제가 있으면 수정 후 다시 저장:

1. **파일 존재 확인**: 핸드오프 프롬프트와 세션 파일에 언급된 파일 경로가 실제로 존재하는지 `ls`로 확인
2. **필수 섹션 체크**: 세션 파일에 배경, 사용법, 현재 상태, 다음 단계, Handoff Prompt 섹션이 모두 존재하는지 확인
3. **핸드오프 프롬프트 완전성**: 7개 필수 필드(이전 세션 맥락, 이어서 할 작업, 첫 번째 행동, 작업 중이던 파일, 현재 에러, 사전 조건, 관련 파일)가 모두 채워져 있는지 확인

검증 통과 후 출력:

```
Session saved: {PROJECT_ROOT}/.omc/sessions/{filename}
Project summary: {PROJECT_ROOT}/.omc/project-summary.md
Handoff prompt copied to clipboard.
Handoff file: {PROJECT_ROOT}/.omc/.handoff-pending
Verification: OK (파일 {N}개 확인, 필수 섹션 완료)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 다른 새 세션에서 이어서 작업하려면 아래 블록을 복사해 붙여넣으세요
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

\`\`\`
이전 세션 맥락을 이어서 작업합니다.

세션명: {SESSION_NAME} (즉시 /rename {SESSION_NAME} 실행)
프로젝트 루트: {PROJECT_ROOT}
세션 파일: {PROJECT_ROOT}/.omc/sessions/{filename}
프로젝트 요약: {PROJECT_ROOT}/.omc/project-summary.md

## 첫 행동 (순서대로 실행)
1. /rename {SESSION_NAME}
2. cat {PROJECT_ROOT}/.omc/sessions/{filename}
3. cat {PROJECT_ROOT}/.omc/project-summary.md

## 작업 주제
{한 줄 요약}

## 이어서 할 작업
{구체적 작업 설명}

## 작업 중이던 파일
{파일:라인 또는 파일 목록}

## 현재 에러/이슈
{있으면 에러 메시지 원문, 없으면 "없음"}

## 실행에 필요한 사전 조건
{서버 실행, Chrome 시작 등, 없으면 "없음"}

## 관련 핵심 파일
{핵심 파일 3-5개}

## 관련 메모리 (있으면)
{MEMORY.md에서 관련 항목 1-3개}

위 정보를 기반으로 추가 질문 없이 즉시 작업을 이어가세요.
\`\`\`

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
같은 세션에서 /clear 후 자동 재개를 원하면 별도 조치 불필요 —
SessionStart hook이 .handoff-pending을 자동으로 읽어 처리합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

위 블록의 모든 `{...}` 자리는 실제 값으로 치환하여 출력한다. 사용자가 곧바로 다른 터미널/세션에 붙여넣을 수 있어야 한다.

끝.
