# F5 Export Spec (Promoted)

**Extracted from:** `2026-04-25-dogfood-feedback.md` F5
**Plan:** `docs/superpowers/plans/2026-04-26-f5-export.md`
**Status:** 🚀 promoted — implemented 2026-04-26

## 결정 (mini-brainstorm 결과)

| 결정 항목 | 값 | 근거 |
|----------|-----|------|
| 포맷 | one-file-per-note + frontmatter + index.jsonl + manifest.json + README | RAG 친화 + Obsidian 호환 |
| 미디어 포함 | 기본 ON, includeMedia 옵션화 | 사용자 선택 가능, dialog 에 평문 경고 |
| 삭제된 노트 | 현 시점 스냅샷만 | soft-delete 컬럼 없음 (slice 외 별 spec 후보) |
| provenance | 평탄 enum (`title_source: 'ai'\|'user'`) | parser 호환성 우선 |
| embedding_text | raw_text 단독 | 가장 미가공, 사용자 별 가공 가능 |
| 파일명 | `YYYY-MM-DD-{id8}-{slugified-ai_title}.md` (export 시점 동결) | 가독 + 정렬, AI 제목 변경 시 새 파일명 (의도) |
| 트리거 | 트레이 메뉴 "내보내기..." 만 | 슬라이스 외부 dep 없이 |
| version | `inkling_export_version: 1` | 첫 출시, 향후 변경 시 manifest 로 식별 |
| 경고 | dialog 에 raw_text 평문 + 비공개 위치 권장 명시 | 슬라이스 §1.1 보안 톤 |

## 범위 (PR 안에 포함됨)

- `src/main/services/exportFormat.ts` (pure: slugify, composeFilename, composeFrontmatter, composeMarkdown, composeIndexJsonl, composeManifest)
- `src/main/services/ExportService.ts` (orchestrator)
- `src/main/repository/NoteRepository.ts` 수정 — `listAll()` 신규 (asc 순)
- `src/main/services/MediaStore.ts` 수정 — `absolutePath()` 신규
- `src/main/index.ts` 수정 — ExportService instantiate + dialog import + 4th tray callback
- `src/main/tray.ts` 수정 — 4번째 callback `runExport` + "내보내기..." 메뉴
- `tests/unit/exportFormat.test.ts` (26 단위 테스트)
- `tests/unit/ExportService.test.ts` (6 단위 테스트)

## 출력 트리

```
<targetDir>/
├── notes/
│   └── 2026-04-25-014a3b9c-주간-회고.md
├── media/
│   └── 014a3b9c__1.png
├── index.jsonl
├── manifest.json
└── README.md
```

## 후속 (별 spec 또는 후속 항목 후보)

- 증분 export (변경된 노트만)
- watch 모드 (자동 동기화)
- CLI 플래그 (`--export <dir>`)
- 다중 형식 (CSV, 단일 JSON, OPML)
- 외부 SaaS 동기화 (Confluence, Notion)
- export 시 raw_text 마스킹/익명화 옵션
- Importer (F6-L3 가 자매 항목)
- embedding_text 합성 규칙 옵션화 (title+summary+raw_text 등)
- 파일명 안정성 옵션 (id-only naming 으로 AI 제목 변경 영향 0)
