@giwonn/claude-daily-review 0.3.1 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,7 +13,7 @@
13
13
  "source": {
14
14
  "source": "url",
15
15
  "url": "https://github.com/giwonn/claude-daily-review.git",
16
- "sha": "49946f8e9b47730b7f60938507f1c13ef362ae1e"
16
+ "sha": "5bb643e083c2447f7feabec1705e8c2865e0ebc6"
17
17
  },
18
18
  "description": "Auto-capture conversations for daily review and career documentation",
19
19
  "version": "0.3.0",
@@ -0,0 +1,69 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ release:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: write
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - name: Create GitHub Release
17
+ env:
18
+ GH_TOKEN: ${{ github.token }}
19
+ run: |
20
+ TAG="${GITHUB_REF#refs/tags/}"
21
+ PREV_TAG=$(git describe --tags --abbrev=0 "${TAG}^" 2>/dev/null || echo "")
22
+ if [ -n "$PREV_TAG" ]; then
23
+ NOTES=$(git log --pretty=format:"- %s" "${PREV_TAG}..${TAG}" | grep -v '\[skip ci\]')
24
+ else
25
+ NOTES=$(git log --pretty=format:"- %s" "${TAG}" | head -20)
26
+ fi
27
+ gh release create "$TAG" --title "$TAG" --notes "$NOTES"
28
+
29
+ publish:
30
+ needs: release
31
+ runs-on: ubuntu-latest
32
+ environment: npm
33
+ permissions:
34
+ contents: read
35
+ id-token: write
36
+ steps:
37
+ - uses: actions/checkout@v4
38
+
39
+ - uses: actions/setup-node@v4
40
+ with:
41
+ node-version: "22"
42
+ registry-url: "https://registry.npmjs.org"
43
+
44
+ - run: npm install -g npm@latest
45
+
46
+ - run: npm publish --access public --provenance
47
+
48
+ update-marketplace:
49
+ needs: release
50
+ runs-on: ubuntu-latest
51
+ permissions:
52
+ contents: write
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+ with:
56
+ ref: master
57
+
58
+ - name: Update SHA in marketplace.json
59
+ run: |
60
+ SHA=$(git rev-parse HEAD)
61
+ sed -i "s/\"sha\": \"[a-f0-9]*\"/\"sha\": \"$SHA\"/" .claude-plugin/marketplace.json
62
+ cat .claude-plugin/marketplace.json
63
+
64
+ - name: Commit and push
65
+ run: |
66
+ git config user.name "github-actions[bot]"
67
+ git config user.email "github-actions[bot]@users.noreply.github.com"
68
+ git add .claude-plugin/marketplace.json
69
+ git diff --cached --quiet && echo "No changes" || (git commit -m "chore: update marketplace SHA [skip ci]" && git push)
package/README.ko.md CHANGED
@@ -1,19 +1,19 @@
1
1
  # claude-daily-review
2
2
 
3
- Claude Code 플러그인으로, 대화 내용을 자동으로 캡처하여 Obsidian vault 또는 GitHub 저장소에 구조화된 일일 회고 마크다운 파일을 생성합니다.
3
+ Claude Code 플러그인으로, 대화 내용을 자동으로 캡처하여 Obsidian vault 또는 GitHub 저장소에 구조화된 회고 마크다운 파일을 생성합니다.
4
4
 
5
- AI와 함께하는 일상 개발 업무를 경력 문서로 자동 변환하세요.
5
+ AI와 함께하는 일상 개발 업무를 경력 문서로 변환하세요 — 원할 때 바로.
6
6
 
7
7
  ## 주요 기능
8
8
 
9
9
  - **자동 수집**: 훅 기반 대화 기록으로 수동 작업 제로
10
+ - **온디맨드 회고 생성**: 원할 때 자연어로 회고 생성 (`/generate`)
11
+ - **자연어 타겟팅**: "어제 회고", "1분기 요약", "my-app 프로젝트 3월 회고"
10
12
  - **구조화된 회고**: 프로젝트별 작업 요약, 배운 점, 의사결정, Q&A 정리
11
13
  - **계단식 요약**: 일간 → 주간 → 월간 → 분기 → 연간
12
- - **프로젝트 추적**: 이력서/경력기술서용 프로젝트별 누적 요약
13
14
  - **Obsidian 연동**: 태그와 링크가 포함된 마크다운 직접 출력
14
15
  - **GitHub 연동**: OAuth 인증으로 GitHub 저장소에 회고 저장
15
- - **동시성 안전**: 세션 격리 쓰기 + 지연 병합으로 데이터 무결성 보장
16
- - **강제종료 복구**: 강제 종료 시에도 원시 로그 보존
16
+ - **강제종료 복구**: 세션 시작 트랜스크립트에서 누락 로그 자동 복구
17
17
 
18
18
  ## 설치
19
19
 
@@ -34,6 +34,29 @@ claude plugin add claude-daily-review
34
34
  2. 간단한 자기소개 (회사, 직무, 팀)
35
35
  3. 요약 주기 선택
36
36
 
37
+ ## 동작 원리
38
+
39
+ ```
40
+ 매 응답 완료 → 원시 로그 자동 저장 (비동기, 논블로킹)
41
+ 세션 시작 → 트랜스크립트에서 누락 로그 복구
42
+ /generate → 원시 로그를 기반으로 회고 생성
43
+ ```
44
+
45
+ ### 회고 생성
46
+
47
+ `/generate`에 자연어로 원하는 범위를 지정할 수 있습니다:
48
+
49
+ ```
50
+ /generate → 누락된 회고 전체 생성
51
+ /generate 어제 회고 만들어줘 → 어제 일일 회고
52
+ /generate 지난주 주간 회고 → 지난주 주간 요약
53
+ /generate 1분기 회고 → 1분기 분기 요약
54
+ /generate my-app 프로젝트 3월 회고 → my-app만 필터한 3월 회고
55
+ /generate 3월 1일~15일 → 날짜 범위 일일 회고
56
+ ```
57
+
58
+ 인자 없이 실행하면 아직 생성되지 않은 회고를 모두 생성합니다 (증분 모드).
59
+
37
60
  ## GitHub 저장소
38
61
 
39
62
  GitHub를 저장소 백엔드로 선택하면, **OAuth Device Flow**로 인증합니다 — 개인 액세스 토큰이 필요 없습니다.
@@ -54,14 +77,6 @@ GitHub를 저장소 백엔드로 선택하면, **OAuth Device Flow**로 인증
54
77
 
55
78
  파일은 **GitHub Contents API**를 통해 읽고 쓰여집니다. 각 회고 파일은 마크다운 파일로 저장소에 직접 커밋되며, 로컬 저장소와 동일한 폴더 구조를 사용합니다. 로컬 git 설치가 필요 없습니다.
56
79
 
57
- ## 동작 원리
58
-
59
- ```
60
- 매 응답 완료 → 원시 로그 저장 (비동기, 논블로킹)
61
- 세션 종료 → AI가 구조화된 회고 생성
62
- 다음 세션 → 회고를 일일 파일에 병합 + 주기별 요약 생성
63
- ```
64
-
65
80
  ## 폴더 구조
66
81
 
67
82
  ```
package/README.md CHANGED
@@ -2,20 +2,20 @@
2
2
 
3
3
  [한국어](README.ko.md)
4
4
 
5
- Claude Code plugin that automatically captures your conversations and generates structured daily review markdown files in your Obsidian vault or GitHub repository.
5
+ Claude Code plugin that automatically captures your conversations and generates structured review markdown files in your Obsidian vault or GitHub repository.
6
6
 
7
- Turn your daily AI-assisted development work into career documentation — automatically.
7
+ Turn your daily AI-assisted development work into career documentation — on demand.
8
8
 
9
9
  ## Features
10
10
 
11
11
  - **Auto-capture**: Hook-based conversation logging with zero manual effort
12
+ - **On-demand reviews**: Generate reviews when you want with natural language (`/generate`)
13
+ - **Natural language targeting**: "yesterday's review", "Q1 summary", "my-app project March review"
12
14
  - **Structured reviews**: Work summaries, learnings, decisions, and Q&A organized by project
13
15
  - **Cascading summaries**: Daily → Weekly → Monthly → Quarterly → Yearly
14
- - **Project tracking**: Per-project summaries for resume/portfolio building
15
16
  - **Obsidian integration**: Direct markdown output with tags and links
16
17
  - **GitHub integration**: Store reviews in a GitHub repo with OAuth authentication
17
- - **Concurrency-safe**: Session-isolated writes with deferred merge
18
- - **Crash recovery**: Raw logs preserved even on force-quit
18
+ - **Crash recovery**: Missing raw logs auto-recovered from transcripts on session start
19
19
 
20
20
  ## Installation
21
21
 
@@ -36,6 +36,29 @@ This will ask for:
36
36
  2. A brief professional profile (company, role, team)
37
37
  3. Which summary periods to enable
38
38
 
39
+ ## How It Works
40
+
41
+ ```
42
+ Every response → Raw log saved automatically (async, non-blocking)
43
+ Session start → Missing logs recovered from transcripts
44
+ /generate → AI generates reviews from raw logs on demand
45
+ ```
46
+
47
+ ### Generating Reviews
48
+
49
+ Use `/generate` with natural language to control what gets generated:
50
+
51
+ ```
52
+ /generate → Generate all missing reviews
53
+ /generate yesterday's review → Daily review for yesterday
54
+ /generate last week's weekly summary → Weekly summary for last week
55
+ /generate Q1 review → Quarterly summary for Q1
56
+ /generate my-app project March review → March review filtered to my-app
57
+ /generate March 1-15 → Daily reviews for date range
58
+ ```
59
+
60
+ When no arguments are given, it generates all reviews that haven't been created yet (incremental mode).
61
+
39
62
  ## GitHub Storage
40
63
 
41
64
  When you choose GitHub as your storage backend, the plugin authenticates using the **OAuth Device Flow** — no personal access tokens required.
@@ -56,18 +79,10 @@ After authenticating, you can either:
56
79
 
57
80
  Files are read and written via the **GitHub Contents API**. Each review file is committed directly to the repository as a markdown file, using the same folder structure as local storage. No local git installation is required.
58
81
 
59
- ## How It Works
60
-
61
- ```
62
- Every response → Raw log saved (async, non-blocking)
63
- Session end → AI generates structured review
64
- Next session → Reviews merged into daily file + periodic summaries generated
65
- ```
66
-
67
82
  ## Vault Structure
68
83
 
69
84
  ```
70
- vault/daily-review/
85
+ daily-review/
71
86
  ├── daily/2026-03-28.md ← Daily review (all projects)
72
87
  ├── weekly/2026-W13.md ← Weekly summary
73
88
  ├── monthly/2026-03.md ← Monthly summary
@@ -89,9 +104,10 @@ Config is stored at `$CLAUDE_PLUGIN_DATA/config.json`.
89
104
  {
90
105
  "storage": {
91
106
  "type": "local",
92
- "vaultPath": "/path/to/obsidian/vault"
107
+ "local": {
108
+ "basePath": "/path/to/obsidian/vault/daily-review"
109
+ }
93
110
  },
94
- "reviewFolder": "daily-review",
95
111
  "language": "ko",
96
112
  "periods": {
97
113
  "daily": true,
@@ -115,12 +131,13 @@ Config is stored at `$CLAUDE_PLUGIN_DATA/config.json`.
115
131
  {
116
132
  "storage": {
117
133
  "type": "github",
118
- "owner": "your-github-username",
119
- "repo": "daily-review",
120
- "branch": "main",
121
- "token": "<stored by OAuth flow>"
134
+ "github": {
135
+ "owner": "your-github-username",
136
+ "repo": "daily-review",
137
+ "token": "<stored by OAuth flow>",
138
+ "basePath": "daily-review"
139
+ }
122
140
  },
123
- "reviewFolder": "daily-review",
124
141
  "language": "ko",
125
142
  "periods": {
126
143
  "daily": true,
@@ -0,0 +1,238 @@
1
+ ---
2
+ description: Configure the daily review plugin — set storage backend, user profile, and review periods
3
+ allowed-tools: ["AskUserQuestion", "Read", "Write", "Bash"]
4
+ ---
5
+
6
+ # Daily Review Setup
7
+
8
+ You are setting up the claude-daily-review plugin for the user.
9
+
10
+ ## Important Rules
11
+
12
+ - **NEVER show raw error messages, stack traces, or file paths to the user.** If a Bash command fails, interpret the error and explain it in plain Korean.
13
+ - When a command fails, tell the user what went wrong and what to do next — not the technical details.
14
+ - Example: Instead of showing "Error: GitHub auth timed out waiting for authorization" with a stack trace, say "GitHub 인증이 시간 초과되었습니다. 다시 시도해주세요."
15
+
16
+ ## Check Existing Config
17
+
18
+ First, read `${CLAUDE_PLUGIN_DATA}/config.json` to see if a config already exists.
19
+
20
+ If it **does not exist**, proceed to the full onboarding flow below.
21
+
22
+ If it **exists**, show the current storage type and profile summary, then ask using AskUserQuestion:
23
+ - question: "이미 설정이 되어 있습니다. 어떻게 할까요?"
24
+ - options:
25
+ 1. label: "현재 설정 유지", description: "변경 없이 그대로 사용합니다"
26
+ 2. label: "저장소 변경", description: "다른 저장소로 변경합니다"
27
+ 3. label: "프로필/주기 변경", description: "프로필이나 요약 주기만 변경합니다"
28
+ 4. label: "처음부터 다시 설정", description: "모든 설정을 초기화합니다"
29
+
30
+ - "현재 설정 유지": exit with "현재 설정을 유지합니다."
31
+ - "저장소 변경": go to Step 0 (Storage Selection), keep existing profile/periods
32
+ - "프로필/주기 변경": go to Step 2 (Profile), keep existing storage
33
+ - "처음부터 다시 설정": delete existing config and proceed to full onboarding flow
34
+
35
+ ## Onboarding Flow
36
+
37
+ ### Step 0: Storage Selection
38
+
39
+ Ask the user using AskUserQuestion:
40
+ - question: "회고를 어디에 저장할까요?"
41
+ - options:
42
+ 1. label: "GitHub 저장소", description: "원격 저장소에 저장. 여러 PC에서 공유 가능"
43
+ 2. label: "로컬 폴더", description: "Obsidian vault 등 로컬 디렉토리에 저장"
44
+
45
+ #### Option 1: GitHub Storage
46
+
47
+ **1a. Authenticate with GitHub OAuth Device Flow:**
48
+
49
+ Run via Bash:
50
+ ```bash
51
+ node "${CLAUDE_PLUGIN_ROOT}/lib/request-device-code.mjs"
52
+ ```
53
+
54
+ Show the user:
55
+ > "GitHub 인증이 필요합니다. 아래 링크를 브라우저에서 열고 코드를 입력해주세요."
56
+ > - URL: https://github.com/login/device
57
+ > - 코드: `{user_code}`
58
+
59
+ Then poll for the token (pass the full device code response as JSON argument):
60
+ ```bash
61
+ node "${CLAUDE_PLUGIN_ROOT}/lib/poll-token.mjs" '{"device_code":"{device_code}","interval":{interval},"user_code":"{user_code}","verification_uri":"https://github.com/login/device","expires_in":900}'
62
+ ```
63
+
64
+ Wait for the user to complete authorization. Store the returned token string.
65
+
66
+ **1b. Select or create a repository:**
67
+
68
+ Ask using AskUserQuestion:
69
+ - question: "GitHub 저장소를 어떻게 할까요?"
70
+ - options:
71
+ 1. label: "새 저장소 만들기", description: "비공개 저장소를 자동 생성합니다"
72
+ 2. label: "기존 저장소 사용", description: "이미 있는 저장소를 지정합니다"
73
+
74
+ - **New:** Ask for a repo name. Create it via Bash:
75
+ ```bash
76
+ MSYS_NO_PATHCONV=1 gh api /user/repos -X POST -f name=<name> -f private=true
77
+ ```
78
+ If `gh` is not available, tell the user to create the repo at https://github.com/new and then provide the `owner/repo`.
79
+ - **Existing:** Ask for the repository in `owner/repo` format. Parse into `owner` and `repo`.
80
+
81
+ **1c. Check for shared config in repo:**
82
+
83
+ After repo is selected/created, try to read the shared config:
84
+ ```bash
85
+ node "${CLAUDE_PLUGIN_ROOT}/lib/storage-cli.mjs" read .config.json
86
+ ```
87
+
88
+ If `.config.json` exists in the repo, parse it and **skip Steps 1-3** (Profile and Periods). Use the values from the shared config. Tell the user:
89
+ > "이전에 저장된 설정을 찾았습니다! 프로필과 주기 설정을 자동으로 복원합니다."
90
+
91
+ If `.config.json` does not exist, proceed to Step 2 (Profile).
92
+
93
+ The local config will be:
94
+ ```json
95
+ {
96
+ "storage": {
97
+ "type": "github",
98
+ "github": {
99
+ "owner": "<owner>",
100
+ "repo": "<repo>",
101
+ "token": "<access_token>",
102
+ "basePath": "daily-review"
103
+ }
104
+ }
105
+ }
106
+ ```
107
+
108
+ The profile/periods/language go into the **shared config** (saved in Step 4).
109
+
110
+ After storage selection, proceed to Step 2 (Profile). Skip Step 1 (Vault Path) for GitHub storage.
111
+
112
+ #### Option 2: Local Storage
113
+
114
+ Proceed to Step 1 (Vault Path) below. The storage config will be:
115
+ ```json
116
+ {
117
+ "storage": {
118
+ "type": "local",
119
+ "local": {
120
+ "basePath": "<path>/daily-review"
121
+ }
122
+ }
123
+ }
124
+ ```
125
+
126
+ ### Step 1: Vault Path (Local storage only)
127
+
128
+ Ask the user:
129
+ > "Obsidian vault 경로를 알려주세요. (예: C:/Users/name/Documents/MyVault)"
130
+
131
+ After they provide a path:
132
+ - Verify the directory exists using the Bash tool: `test -d "{path}" && echo "OK" || echo "NOT_FOUND"`
133
+ - If not found, ask them to check the path
134
+ - Normalize the path (resolve ~, remove trailing slashes)
135
+ - Set the `basePath` in the storage config to `{path}/daily-review`
136
+
137
+ ### Step 2: Profile
138
+
139
+ Ask each profile field one at a time using AskUserQuestion.
140
+
141
+ **회사명:**
142
+ - question: "어떤 회사에서 일하고 계신가요?"
143
+ - options:
144
+ 1. label: "직접 입력", description: ""
145
+ 2. label: "건너뛰기", description: "나중에 설정할 수 있습니다"
146
+ - If "직접 입력" selected: ask "회사명을 입력해주세요" in the next message and wait for text response.
147
+ - If "건너뛰기" selected: store as empty string.
148
+
149
+ **역할/직무:**
150
+ - question: "역할/직무가 뭔가요?"
151
+ - options:
152
+ 1. label: "직접 입력", description: "예: 프론트엔드 개발자"
153
+ 2. label: "건너뛰기", description: "나중에 설정할 수 있습니다"
154
+
155
+ **팀/도메인:**
156
+ - question: "팀이나 담당 도메인이 있다면?"
157
+ - options:
158
+ 1. label: "직접 입력", description: "예: 결제플랫폼팀"
159
+ 2. label: "건너뛰기", description: "나중에 설정할 수 있습니다"
160
+
161
+ **하는 일 설명:**
162
+ - question: "하고 계신 일을 한 줄로 설명하면?"
163
+ - options:
164
+ 1. label: "직접 입력", description: "예: B2B SaaS 결제 시스템 개발 및 운영"
165
+ 2. label: "건너뛰기", description: "나중에 설정할 수 있습니다"
166
+
167
+ ### Step 3: Periods
168
+
169
+ Ask using AskUserQuestion with multiSelect:
170
+ - question: "어떤 주기로 회고를 요약할까요? (daily는 항상 활성화)"
171
+ - multiSelect: true
172
+ - options:
173
+ 1. label: "weekly (주간)", description: "매주 요약"
174
+ 2. label: "monthly (월간)", description: "매월 요약"
175
+ 3. label: "quarterly (분기)", description: "분기별 요약"
176
+ 4. label: "yearly (연간)", description: "연간 요약"
177
+
178
+ Selected items are enabled. daily is always true.
179
+
180
+ ### Step 4: Save
181
+
182
+ **Save local config** to `${CLAUDE_PLUGIN_DATA}/config.json` using the Write tool.
183
+
184
+ For **local storage**, the config includes everything:
185
+ ```json
186
+ {
187
+ "storage": { "type": "local", "local": { "basePath": "..." } },
188
+ "language": "ko",
189
+ "periods": { "daily": true, "weekly": true, "monthly": true, "quarterly": true, "yearly": false },
190
+ "profile": { "company": "...", "role": "...", "team": "...", "context": "..." }
191
+ }
192
+ ```
193
+
194
+ For **GitHub storage**, the local config only has storage credentials:
195
+ ```json
196
+ {
197
+ "storage": { "type": "github", "github": { "owner": "...", "repo": "...", "token": "...", "basePath": "daily-review" } },
198
+ "language": "ko",
199
+ "periods": { "daily": true, "weekly": true, "monthly": true, "quarterly": true, "yearly": false },
200
+ "profile": { "company": "...", "role": "...", "team": "...", "context": "..." }
201
+ }
202
+ ```
203
+
204
+ Additionally, **save shared config to the repo** so other machines can restore it:
205
+ ```bash
206
+ echo '<shared_config_json>' | node "${CLAUDE_PLUGIN_ROOT}/lib/storage-cli.mjs" write .config.json
207
+ ```
208
+
209
+ The shared config contains only profile, periods, and language (NO storage credentials):
210
+ ```json
211
+ {
212
+ "language": "ko",
213
+ "periods": { "daily": true, "weekly": true, "monthly": true, "quarterly": true, "yearly": false },
214
+ "profile": { "company": "...", "role": "...", "team": "...", "context": "..." }
215
+ }
216
+ ```
217
+
218
+ **If local storage:** Create the vault directories:
219
+ ```bash
220
+ node "${CLAUDE_PLUGIN_ROOT}/lib/create-dirs.mjs"
221
+ ```
222
+
223
+ **If GitHub storage:** Skip directory creation.
224
+
225
+ ### Step 5: Confirm
226
+
227
+ Tell the user:
228
+
229
+ **For local storage:**
230
+ > "설정 완료! 이제부터 대화 내용이 자동으로 기록됩니다."
231
+ > "회고 파일은 `{basePath}/` 에서 확인하세요."
232
+ > "설정을 변경하려면 `/daily-review-setup`을 다시 실행하세요."
233
+
234
+ **For GitHub storage:**
235
+ > "설정 완료! 이제부터 대화 내용이 자동으로 GitHub에 기록됩니다."
236
+ > "회고 파일은 `https://github.com/{owner}/{repo}` 에서 확인하세요."
237
+ > "설정을 변경하려면 `/daily-review-setup`을 다시 실행하세요."
238
+ > "다른 PC에서도 GitHub 인증만 하면 설정이 자동으로 복원됩니다."
@@ -0,0 +1,195 @@
1
+ ---
2
+ description: Generate reviews from raw conversation logs (supports natural language targeting)
3
+ allowed-tools: ["Read", "Write", "Bash"]
4
+ ---
5
+
6
+ # Generate Reviews
7
+
8
+ ## Important Rules
9
+
10
+ - Write all review content in Korean.
11
+ - **NEVER show raw error messages or file paths to the user.**
12
+ - Use the user's profile to add business context.
13
+ - Today's date: use the system date for resolving relative expressions.
14
+
15
+ ## Step 0: Interpret User Request
16
+
17
+ The user may provide a natural language request as arguments. Parse their intent to determine:
18
+
19
+ 1. **Date scope** — which dates/periods to generate
20
+ 2. **Period type** — daily, weekly, monthly, quarterly, yearly (or all cascading)
21
+ 3. **Project filter** — specific project name (optional)
22
+ 4. **Force regeneration** — whether to regenerate already-generated reviews
23
+
24
+ ### Interpretation Examples
25
+
26
+ | User input | from | to | force | Period type | Project |
27
+ |---|---|---|---|---|---|
28
+ | (empty) | - | - | no | all missing | all |
29
+ | "어제 회고" | yesterday | yesterday | yes | daily | all |
30
+ | "3월 15일 회고" | 2026-03-15 | 2026-03-15 | yes | daily | all |
31
+ | "지난주 주간 회고" | (week start) | (week end) | yes | weekly | all |
32
+ | "이번달 회고" | (month start) | today | yes | daily+monthly | all |
33
+ | "1분기 회고" | Q1 start | Q1 end | yes | quarterly | all |
34
+ | "my-app 프로젝트 3월 회고" | 03-01 | 03-31 | yes | daily+monthly | my-app |
35
+ | "올해 회고 다시 만들어줘" | year start | today | yes | all cascade | all |
36
+ | "3월 1일~15일" | 03-01 | 03-15 | yes | daily | all |
37
+
38
+ **Rules:**
39
+ - If the user specifies a specific date/period, set `force` to `yes` (they want it regenerated).
40
+ - If no input is given, run in default mode (generate only missing reviews, no force).
41
+ - For period types like "주간", "월간", "분기", "연간": generate the requested summary AND any prerequisite lower-level reviews needed as input.
42
+ - When the user mentions a project name, generate reviews for all dates but only include logs from that project's cwd.
43
+
44
+ ## Step 1: Collect Data
45
+
46
+ Based on Step 0 interpretation, build the command:
47
+
48
+ ```bash
49
+ CLAUDE_PLUGIN_DATA="${CLAUDE_PLUGIN_DATA}" node "${CLAUDE_PLUGIN_ROOT}/lib/collect-raw-logs.mjs" [OPTIONS]
50
+ ```
51
+
52
+ Options (all optional):
53
+ - `--from YYYY-MM-DD` — start date filter
54
+ - `--to YYYY-MM-DD` — end date filter
55
+ - `--force` — include dates even if already generated
56
+
57
+ If no options, runs in default incremental mode (only new logs since last generation).
58
+
59
+ This outputs JSON with:
60
+ - `profile`: user's company/role/team/context
61
+ - `language`: review language
62
+ - `needs.daily`: dates that need daily review generation
63
+ - `needs.weekly`: weeks that need weekly summary
64
+ - `needs.monthly`: months that need monthly summary
65
+ - `needs.quarterly`: quarters that need quarterly summary
66
+ - `needs.yearly`: years that need yearly summary
67
+ - `logs`: raw conversation logs keyed by date
68
+
69
+ If `needs` is all empty, tell the user "해당 기간에 생성할 회고가 없습니다." and stop.
70
+
71
+ ## Step 2: Apply Filters
72
+
73
+ - **Project filter**: If the user requested a specific project, filter `logs[date]` entries to only include those where the last path segment of `cwd` matches the project name.
74
+ - **Period type filter**: If the user only requested a specific period type (e.g., "주간 회고"), only generate that type and its prerequisites. For example, if weekly is requested, generate daily reviews first (as input), then the weekly summary.
75
+
76
+ ## Step 3: Generate Daily Reviews
77
+
78
+ For each date in `needs.daily`:
79
+
80
+ 1. Take all log entries from `logs[date]`
81
+ 2. Group by `cwd` (last path segment = project name)
82
+ 3. For each project, analyze user/assistant pairs and extract:
83
+ - **작업 요약**: What was accomplished (use profile for business context)
84
+ - **배운 것**: New things learned
85
+ - **고민한 포인트**: Decisions and reasoning
86
+ - **질문과 답변**: Key Q&A (summarized)
87
+ 4. General questions go under "미분류"
88
+
89
+ Write via:
90
+ ```bash
91
+ echo '<content>' | CLAUDE_PLUGIN_DATA="${CLAUDE_PLUGIN_DATA}" node "${CLAUDE_PLUGIN_ROOT}/lib/storage-cli.mjs" write "daily/{date}.md"
92
+ ```
93
+
94
+ Format:
95
+ ```markdown
96
+ ---
97
+ date: {date}
98
+ type: daily-review
99
+ projects: [{names}]
100
+ ---
101
+
102
+ # {date} Daily Review
103
+
104
+ ## [{project}] {title}
105
+ **작업 요약:** {summary}
106
+ **배운 것:**
107
+ - {item}
108
+ **고민한 포인트:**
109
+ - {decision} → {choice} ({reason})
110
+ **질문과 답변:**
111
+ - Q: {question}
112
+ → A: {answer}
113
+
114
+ ## 미분류
115
+ - Q: {question}
116
+ → A: {answer}
117
+ ```
118
+
119
+ ## Step 4: Generate Weekly Summaries
120
+
121
+ For each week in `needs.weekly`:
122
+
123
+ 1. Read the daily reviews that belong to this week using:
124
+ ```bash
125
+ CLAUDE_PLUGIN_DATA="${CLAUDE_PLUGIN_DATA}" node "${CLAUDE_PLUGIN_ROOT}/lib/storage-cli.mjs" read "daily/{date}.md"
126
+ ```
127
+ 2. Summarize into weekly review with:
128
+ - 주요 성과
129
+ - 기술 스택 활용
130
+ - 핵심 의사결정
131
+ - 성장 포인트
132
+
133
+ Write to `weekly/{week}.md`.
134
+
135
+ ## Step 5: Generate Monthly Summaries
136
+
137
+ For each month in `needs.monthly`:
138
+
139
+ 1. Read weekly reviews for that month (or daily reviews if weekly is empty)
140
+ 2. Summarize into monthly review with:
141
+ - 프로젝트별 진행 요약
142
+ - 이번 달 핵심 성장
143
+ - 기술 스택
144
+ - 주요 의사결정 기록
145
+
146
+ Write to `monthly/{month}.md`.
147
+
148
+ ## Step 6: Generate Quarterly Summaries
149
+
150
+ For each quarter in `needs.quarterly`:
151
+
152
+ 1. Read monthly reviews for that quarter
153
+ 2. Summarize with:
154
+ - 분기 성과 요약
155
+ - 핵심 역량 성장
156
+ - 기술 스택 총괄
157
+ - 경력기술서 하이라이트
158
+
159
+ Write to `quarterly/{quarter}.md`.
160
+
161
+ ## Step 7: Generate Yearly Summaries
162
+
163
+ For each year in `needs.yearly`:
164
+
165
+ 1. Read quarterly reviews for that year
166
+ 2. Summarize with:
167
+ - 연간 프로젝트 총괄
168
+ - 핵심 역량 맵
169
+ - 이력서용 요약
170
+ - 경력기술서용 상세
171
+
172
+ Write to `yearly/{year}.md`.
173
+
174
+ ## Step 8: Update last-generated timestamp
175
+
176
+ **Only update if running in default mode (no user-specified scope).**
177
+
178
+ If the user requested a specific date/period/project, do NOT update `last-generated.json` — the incremental tracking should remain unchanged.
179
+
180
+ If running in default mode, save the `newTimestamp` from Step 1:
181
+ ```bash
182
+ echo '{"timestamp":"NEW_TIMESTAMP_VALUE"}' > "${CLAUDE_PLUGIN_DATA}/last-generated.json"
183
+ ```
184
+
185
+ ## Step 9: Report
186
+
187
+ Tell the user what was generated:
188
+ > "회고 생성 완료!"
189
+ > - 일일 회고: {count}개
190
+ > - 주간 요약: {count}개
191
+ > - 월간 요약: {count}개
192
+ > - 분기 요약: {count}개
193
+ > - 연간 요약: {count}개
194
+
195
+ Only show lines where count > 0.