Claude Code와 Codex 작업 세션을 Markdown 일지 또는 Notion 업무일지로 기록하는 CLI 도구입니다.
English | 한국어
커뮤니티 프로젝트입니다. Anthropic 또는 OpenAI의 공식 프로젝트가 아닙니다.
Working Diary는 AI 코딩 세션에서 사라지기 쉬운 작업 맥락을 남깁니다.
- 사용자가 요청한 작업
- 생성/수정된 파일
- 실행한 주요 명령
- Git branch, commit, diff 통계
- 작업 요약과 오류
- Notion 업무 DB용 task row
패키지 이름은 호환성을 위해 claude-diary를 유지합니다. 사용자 문서에서는 중립 alias인 working-diary를 우선 사용합니다.
pip install claude-diary
working-diary init| 에이전트 | 자동 기록 | 수동 Markdown | Notion 업무일지 | 적용/갱신 |
|---|---|---|---|---|
| Claude Code | Stop Hook | /diary |
/diary-notion |
working-diary install --force |
| Codex | 없음 | $diary |
$diary-notion |
working-diary install --force --codex-only |
패키지 설치는 공통이지만 에이전트에 적용하는 명령은 다릅니다. Codex만 쓰는 경우에는 --codex-only를 사용하면 Claude Code 설정을 수정하지 않습니다. --codex는 Claude Code hook/slash command도 함께 갱신하는 호환 옵션입니다.
자동 일지는 날짜별 파일에 append됩니다.
~/working-diary/
2026-03-15.md
2026-03-16.md
.session_counts.json
weekly/
W11_2026-03-09.md
수동 일지는 자동 일지와 분리되어 프로젝트별로 저장됩니다.
~/working-diary/manual/
2026-04-29/
my-project/
2026-04-29.md
처음 쓰는 경우에는 목표에 맞는 실행 순서를 그대로 진행합니다.
| 목표 | 실행 순서 |
|---|---|
| Claude Code에서 Markdown 자동/수동 기록 | pip install claude-diary -> working-diary init -> working-diary install --force |
| Claude Code에서 Notion 업무일지까지 사용 | pip install "claude-diary[notion]" -> working-diary init -> working-diary install --force -> working-diary diary-notion init -> working-diary diary-notion ensure |
| Codex에서 Markdown 수동 기록 | pip install claude-diary -> working-diary init --codex-only -> working-diary install --force --codex-only -> 새 Codex 세션 |
| Codex에서 Notion 업무일지까지 사용 | pip install "claude-diary[notion]" -> working-diary init --codex-only -> working-diary install --force --codex-only -> working-diary diary-notion init -> working-diary diary-notion ensure -> 새 Codex 세션 |
pip 설치:
pip install claude-diary
working-diary initNotion 연동까지 사용할 경우:
pip install "claude-diary[notion]"
working-diary initClaude Code 플러그인 설치는 별도 배포 경로입니다. Claude Code의 plugin marketplace에서 이 프로젝트를 설치할 때 사용합니다.
# Claude Code 안에서 실행
/plugin marketplace add https://github.com/solzip/working-diary
/plugin install working-diary이 플러그인은 Claude Code 쪽 hook 설정을 배포합니다. working-diary CLI는 Python 패키지에서 제공되므로, 플러그인 경로를 쓰더라도 Python 패키지 설치와 working-diary init이 준비되어 있어야 합니다.
소스에서 설치:
git clone https://github.com/solzip/working-diary.git
cd working-diary
pip install -e .
working-diary init소스 설치에서 Notion 연동까지 사용할 경우:
pip install -e ".[notion]"working-diary init은 설정 파일과 일지 디렉터리를 만들고 Claude Code Stop Hook도 함께 등록합니다. Codex만 쓰는 경우에는 working-diary init --codex-only를 실행하면 Claude Code 설정을 수정하지 않습니다.
Claude Code나 Codex에서 slash command 또는 skill을 최신 상태로 쓰려면 아래 에이전트별 적용 명령을 추가로 실행합니다.
Claude Code는 세션 종료 시 자동 기록할 수 있고, 세션 중 수동 기록도 할 수 있습니다.
Claude Code 적용 또는 갱신:
working-diary install --force자동 기록:
Claude Code 세션 종료
-> Stop Hook 실행
-> transcript 분석
-> ~/working-diary/YYYY-MM-DD.md
수동 Markdown 일지:
/diary
Notion 업무일지:
/diary-notion
/diary는 현재 프로젝트의 Claude Code transcript를 찾아 working-diary write core로 기록합니다. /diary-notion은 세션 내용을 task row로 정리한 JSON을 만든 뒤 working-diary diary-notion push core로 전달합니다.
Codex는 자동 hook을 사용하지 않습니다. 사용자가 skill을 호출할 때만 기록합니다.
Codex 적용 또는 갱신:
working-diary install --force --codex-only--codex-only는 Codex skill만 ~/.codex/skills 아래에 설치하고 Claude Code hook/slash command는 수정하지 않습니다. --codex는 기존 호환 옵션으로 Claude Code hook/slash command를 함께 갱신합니다.
수동 Markdown 일지:
$diary
Notion 업무일지:
$diary-notion
$diary와 $diary-notion은 현재 Codex 대화와 도구 사용 내역을 바탕으로 JSON을 만든 뒤 같은 core CLI를 호출합니다.
이미 실행 중인 Codex 세션은 시작 시점에 로드한 skill을 유지합니다. 갱신된 skill은 새 Codex 세션에서 반영됩니다.
Notion 업무일지를 쓰려면 Notion API용 requests가 필요합니다.
pip install "claude-diary[notion]"소스 설치에서 Notion까지 사용할 경우:
pip install -e ".[notion]"설정 절차:
- https://www.notion.so/my-integrations 에서 Integration을 만들고 토큰을 복사합니다.
- Notion에 루트 페이지를 만듭니다. 예:
Working Diary - 루트 페이지를 Integration에 공유합니다.
- 설정을 저장합니다.
working-diary diary-notion initdiary-notion init은 입력한 Notion token과 root page ID를 로컬 config에 저장합니다. 이후 CLAUDE_DIARY_NOTION_TOKEN 또는 CLAUDE_DIARY_NOTION_ROOT_PAGE_ID 환경변수를 지정하면 저장된 config 값보다 환경변수가 우선합니다.
- 연도별
EntriesDB와 schema/view를 보장합니다.
working-diary diary-notion ensure- 세션에서
/diary-notion또는$diary-notion을 실행합니다.
working-diary diary-notion push --input .diary-notion-<id>.json
working-diary diary-notion push --input .diary-notion-<id>.json --force- 기본 push는
Session ID + Task Index로 이미 기록된 row를 skip합니다. --force는 같은 세션의 기존 row를 archive한 뒤 다시 push합니다.- 실패한 task가 하나라도 있으면 exit code
1로 종료하고 입력 JSON을 보존합니다. - 전체 성공 또는 이미 push된 task만 skip된 경우 exit code
0으로 종료합니다.
작업 계층 접기/펼치기는 Notion의 native Sub-items 기능을 사용합니다. 이 기능은 Notion UI에서 한 번 켜야 합니다.
- 해당 연도의
EntriesDB를 엽니다. - 우상단
...메뉴에서Sub-items를 활성화합니다. - 다시
working-diary diary-notion ensure를 실행합니다.
Sub-items가 아직 없어도 row 기록은 정상 동작합니다. 다만 계층 nesting만 표시되지 않고, push 명령이 안내를 출력합니다.
Core는 에이전트와 무관하게 실제 기록 처리를 담당합니다.
입력
-> transcript 또는 agent-authored JSON
-> cwd, session_id, task metadata
core 처리
-> parser
-> Git 정보 보강
-> category 추론
-> secret scan
-> formatter
-> writer 또는 Notion exporter
-> audit/index/export retry
주요 모듈:
| 영역 | 파일 | 역할 |
|---|---|---|
| CLI entry | src/claude_diary/cli/__init__.py |
working-diary, claude-diary 명령 라우팅 |
| 자동 기록 core | src/claude_diary/core.py |
Claude Code Stop Hook 자동 일지 pipeline |
| 수동 기록 core | src/claude_diary/cli/write.py |
/diary, $diary, working-diary write 처리 |
| Notion push | src/claude_diary/cli/notion_push.py |
task JSON을 Notion row로 push |
| Notion schema/view | src/claude_diary/cli/notion_ensure.py |
schema v7, core/operating views 보장 |
| Formatter | src/claude_diary/formatter.py |
Markdown entry와 Notion page body 생성 |
Claude Code에는 두 경로가 있습니다.
자동 기록:
Claude Code Stop Hook
-> src/claude_diary/hook.py
-> core.process_session(session_id, transcript_path, cwd)
-> ~/working-diary/YYYY-MM-DD.md
수동 기록:
/diary
-> claude-diary write
-> 현재 cwd에 맞는 Claude transcript 탐색
-> manual diary 경로에 append
/diary-notion
-> agent가 task JSON 생성
-> claude-diary diary-notion push --input <json>
-> Notion Entries DB에 row push
설치 명령 working-diary install --force는 다음을 갱신합니다.
~/.claude/settings.jsonStop Hook~/.claude/commands/diary.md~/.claude/commands/diary-notion.md
Codex는 Stop Hook이 없습니다. 전역 skill을 통해 core CLI를 호출합니다.
$diary
-> Codex가 현재 세션 내용을 .diary-<id>.json으로 작성
-> working-diary write --input .diary-<id>.json
-> manual diary 경로에 append
$diary-notion
-> Codex가 현재 세션을 task 단위로 분리
-> .diary-notion-<id>.json 작성
-> working-diary diary-notion push --input .diary-notion-<id>.json
-> Notion Entries DB에 row push
설치 명령 working-diary install --force --codex-only는 다음을 갱신합니다.
~/.codex/skills/diary/SKILL.md~/.codex/skills/diary-notion/SKILL.md
핵심 명령:
working-diary init
working-diary init --codex-only
working-diary install --force
working-diary install --force --codex
working-diary install --force --codex-only
working-diary uninstall
working-diary uninstall --codex
working-diary uninstall --codex-only
working-diary write
working-diary diary-notion init
working-diary diary-notion ensure
working-diary diary-notion ensure --dry-run
working-diary diary-notion push --input .diary-notion-<id>.json
working-diary notion push --input .diary-notion-<id>.json조회와 관리 명령:
working-diary search "키워드"
working-diary filter --project my-app
working-diary trace src/main.py
working-diary stats
working-diary weekly
working-diary audit
working-diary audit --verify
working-diary config
working-diary config --set lang=en
working-diary migrate
working-diary reindex
working-diary delete --last확장 기능 명령:
working-diary config --add-exporter slack
working-diary config --add-exporter discord
working-diary config --add-exporter obsidian
working-diary config --add-exporter github
working-diary dashboard
working-diary dashboard --serve --port 8787
working-diary team stats
working-diary team weekly
working-diary team monthly --month 2026-06
working-diary team init --repo <url> --name <name>
working-diary team add-member --name <name> --role member기존 CLI도 계속 지원합니다.
claude-diary write
claude-diary diary-notion ensure설정 파일은 OS별 사용자 config 경로의 claude-diary/config.json에 저장됩니다. Notion 같은 exporter를 설정하면 API token, webhook URL, root page ID도 이 로컬 config에 저장됩니다. CLI 출력에서는 긴 token과 webhook 값을 masking해서 보여줍니다.
| 환경변수 | 설명 | 기본값 |
|---|---|---|
CLAUDE_DIARY_LANG |
일지 언어. ko 또는 en |
ko |
CLAUDE_DIARY_DIR |
자동 일지 저장 경로 | ~/working-diary |
CLAUDE_DIARY_MANUAL_DIR |
수동 일지 저장 경로 | ~/working-diary/manual |
CLAUDE_DIARY_TZ_OFFSET |
UTC offset | 9 |
CLAUDE_DIARY_NOTION_TOKEN |
Notion token. config보다 우선 | - |
CLAUDE_DIARY_NOTION_ROOT_PAGE_ID |
Notion root page ID. config보다 우선 | - |
CLAUDE_DIARY_SKIP |
1, true, yes이면 Claude Code Stop Hook 자동 기록 skip |
- |
PowerShell에서 한글이나 이모지가 깨져 보이면 현재 세션 출력 인코딩을 UTF-8로 바꿉니다.
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
$OutputEncoding = [System.Text.UTF8Encoding]::new()- 자동 카테고리 분류
- Git branch, commit, diff stat 기록
- secret scan과 masking
- 검색 인덱스
- Notion 업무일지:
working-diary diary-notion init->working-diary diary-notion ensure - Slack, Discord, Obsidian, GitHub exporter:
working-diary config --add-exporter <name> - HTML dashboard:
working-diary dashboard또는working-diary dashboard --serve --port 8787 - audit log와 source checksum 검증
- team mode:
working-diary team init --repo <url> --name <name>
| 증상 | 확인할 것 |
|---|---|
/diary 또는 /diary-notion이 최신 지시문을 쓰지 않음 |
working-diary install --force로 hook과 slash command를 갱신 |
$diary 또는 $diary-notion이 최신 지시문을 쓰지 않음 |
working-diary install --force --codex-only로 skill을 갱신한 뒤 새 Codex 세션 시작 |
| Notion push가 인증 오류를 냄 | Integration token, root page ID, page 공유 상태 확인 |
| Notion 하위항목 nesting이 안 보임 | Entries DB에서 Notion UI의 Sub-items를 한 번 활성화 |
| push 재시도 시 중복이 걱정됨 | 기본 push는 같은 Session ID + Task Index를 skip. 다시 쓰려면 --force 사용 |
| PowerShell에서 글자가 깨짐 | 위 UTF-8 출력 설정 적용 |
pip install -e ".[dev,notion]"
python -m pytest -q
python -m ruff check .현재 README는 사용 가능한 기능을 중심으로 유지하고, 상세 설계와 진행 기록은 docs/에 둡니다.
| 구분 | 내용 |
|---|---|
| 현재 안정화 | Claude Code Stop Hook, Codex skill, Markdown 일지, Notion task row push, schema/view ensure |
| 다음 개선 | Windows 설치/출력 경험 정리, Notion sub-item 안내 개선, CI/lint 범위 점진 확대 |
| 검토 중 | SQLite 기반 검색 인덱스, Cursor/Windsurf/VS Code 같은 다른 AI IDE 연동 |
MIT