@giwonn/claude-daily-review 0.2.3 → 0.3.0

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.
@@ -0,0 +1,582 @@
1
+ # claude-daily-review 설계 문서
2
+
3
+ ## 1. 개요
4
+
5
+ Claude Code 플러그인으로, 사용자의 Claude 대화를 자동 수집하여 Obsidian vault에 일별/프로젝트별 회고 마크다운을 생성한다. 계단식 주기 요약(daily → weekly → monthly → quarterly → yearly)을 통해 경력기술서 및 이력서 작성에 활용할 수 있는 구조화된 기록을 자동으로 쌓는다.
6
+
7
+ ## 2. 핵심 목표
8
+
9
+ - **자동 수집:** hook 기반으로 사용자 개입 없이 대화 기록 수집
10
+ - **구조화된 회고:** 작업 단위로 분류된 회고 마크다운 생성
11
+ - **계단식 요약:** daily → weekly → monthly → quarterly → yearly 단계별 압축
12
+ - **프로젝트별 추적:** cwd 기반 프로젝트 자동 분류 + 누적 요약
13
+ - **동시성 안전:** 여러 세션 동시 실행 시 데이터 무결성 보장
14
+ - **강제종료 복구:** raw 로그 기반 복구로 데이터 유실 방지
15
+ - **Obsidian 통합:** vault에 직접 마크다운 파일 생성, 태그/링크 활용
16
+ - **오픈소스 배포:** npm 패키지, 범용 설정, 크로스 플랫폼
17
+
18
+ ## 3. 아키텍처
19
+
20
+ ```
21
+ claude-daily-review (Claude Code Plugin)
22
+ ├── hooks/hooks.json ← 훅 정의
23
+ ├── src/
24
+ │ ├── core/
25
+ │ │ ├── config.ts ← 설정 관리
26
+ │ │ ├── raw-logger.ts ← raw 로그 append (동시성 처리)
27
+ │ │ ├── reviewer.ts ← 회고 마크다운 생성 로직
28
+ │ │ ├── summarizer.ts ← 주기별 요약 생성
29
+ │ │ └── vault.ts ← Obsidian vault 파일 구조 관리
30
+ │ ├── hooks/
31
+ │ │ ├── on-stop.ts ← Stop 훅: raw 로그 append (async)
32
+ │ │ ├── on-session-start.ts ← SessionStart 훅: 복구 + 주기 요약 + 설정 안내
33
+ │ │ └── on-session-end.ts ← SessionEnd 훅: AI 요약 생성 (agent)
34
+ │ └── commands/
35
+ │ └── setup.ts ← /daily-review-setup 명령어
36
+ ├── package.json
37
+ └── README.md
38
+ ```
39
+
40
+ ### 모듈 책임
41
+
42
+ | 모듈 | 역할 |
43
+ |------|------|
44
+ | `config.ts` | `$CLAUDE_PLUGIN_DATA/config.json` 읽기/쓰기, 기본값 제공, 유효성 검증 |
45
+ | `raw-logger.ts` | stdin JSON 파싱, lockfile 기반 동시성 처리, JSONL append |
46
+ | `reviewer.ts` | transcript/raw 로그 → 작업 분류 → 구조화된 회고 마크다운 생성 |
47
+ | `summarizer.ts` | 하위 주기 문서들을 읽어 상위 주기 요약 생성 (계단식) |
48
+ | `vault.ts` | 디렉토리 생성, 파일 존재 여부 확인, 기존 파일 merge |
49
+
50
+ ## 4. 데이터 플로우
51
+
52
+ ### 4.1 매 응답 완료 (Stop 훅, async)
53
+
54
+ ```
55
+ Stop 이벤트 발생
56
+ → stdin에서 JSON 수신 (session_id, transcript_path, cwd)
57
+ → raw-logger가 lockfile 획득
58
+ → .raw/{session-id}/{date}.jsonl에 append
59
+ → lockfile 해제
60
+ ```
61
+
62
+ - async로 실행되어 사용자 작업 흐름 차단 없음
63
+ - 강제종료 시에도 마지막 Stop 시점까지 데이터 보존
64
+
65
+ ### 4.2 세션 종료 (SessionEnd 훅, agent)
66
+
67
+ ```
68
+ SessionEnd 이벤트 발생
69
+ → agent 훅이 transcript_path로 전체 대화 읽기
70
+ → cwd 기반 프로젝트 분류
71
+ → 작업 단위로 그룹핑 (같은 프로젝트 내 주제 분리)
72
+ → 회고 마크다운 생성:
73
+ - daily/{date}.md (통합)
74
+ - projects/{project-name}/{date}.md (프로젝트별)
75
+ - uncategorized/{date}.md (미분류)
76
+ → projects/{project-name}/summary.md 누적 갱신
77
+ → raw 로그에 처리 완료 마킹
78
+ ```
79
+
80
+ ### 4.3 세션 시작 (SessionStart 훅, agent)
81
+
82
+ ```
83
+ SessionStart 이벤트 발생
84
+ → config.json 존재 확인
85
+ → 없으면: 설정 안내 메시지 반환 (exit code 2)
86
+ → 미처리 raw 로그 확인
87
+ → 있으면: 해당 raw 로그 기반 회고 생성 (복구)
88
+ → 주기별 요약 필요 여부 확인:
89
+ → 새로운 주 시작 && weekly 활성화 → 지난주 weekly 생성
90
+ → 새로운 달 시작 && monthly 활성화 → 지난달 monthly 생성
91
+ → 새로운 분기 시작 && quarterly 활성화 → 지난 분기 quarterly 생성
92
+ → 새로운 해 시작 && yearly 활성화 → 지난해 yearly 생성
93
+ ```
94
+
95
+ ## 5. Obsidian Vault 파일 구조
96
+
97
+ ```
98
+ {vaultPath}/{reviewFolder}/
99
+ ├── daily/
100
+ │ └── 2026-03-28.md
101
+ ├── weekly/ ← 설정에서 활성화 시
102
+ │ └── 2026-W13.md
103
+ ├── monthly/ ← 설정에서 활성화 시
104
+ │ └── 2026-03.md
105
+ ├── quarterly/ ← 설정에서 활성화 시
106
+ │ └── 2026-Q1.md
107
+ ├── yearly/ ← 설정에서 활성화 시
108
+ │ └── 2026.md
109
+ ├── projects/
110
+ │ └── {project-name}/
111
+ │ ├── 2026-03-28.md ← 프로젝트 일별 상세
112
+ │ └── summary.md ← 프로젝트 누적 요약 (이력서/경력기술서용)
113
+ ├── uncategorized/
114
+ │ └── 2026-03-28.md ← 프로젝트와 무관한 일반 질문
115
+ └── .raw/
116
+ └── {session-id}/
117
+ └── 2026-03-28.jsonl ← raw 로그 (Obsidian에서 숨김)
118
+ ```
119
+
120
+ ## 6. 마크다운 템플릿
121
+
122
+ ### 6.1 Daily (daily/2026-03-28.md)
123
+
124
+ ```markdown
125
+ ---
126
+ date: 2026-03-28
127
+ type: daily-review
128
+ projects: [my-app, blog]
129
+ tags: [인증, jwt, seo, next-auth]
130
+ ---
131
+
132
+ # 2026-03-28 Daily Review
133
+
134
+ ## [my-app] 인증 시스템 리팩토링
135
+ **작업 요약:** JWT 기반 인증으로 전환
136
+ **배운 것:**
137
+ - next-auth v5의 session 전략 차이
138
+ - middleware에서 JWT 검증 패턴
139
+ **고민한 포인트:**
140
+ - JWT vs Session → JWT 선택 (stateless, 스케일링 유리)
141
+ **질문과 답변:**
142
+ - Q: refresh token rotation 구현 방법?
143
+ → A: ...
144
+
145
+ ## [blog] SEO 메타태그 추가
146
+ **작업 요약:** 동적 OG 이미지 생성
147
+ **배운 것:**
148
+ - next/og의 ImageResponse API
149
+ **고민한 포인트:**
150
+ - (없음)
151
+ **질문과 답변:**
152
+ - Q: OG 이미지 캐싱 전략?
153
+ → A: ...
154
+
155
+ ## 미분류
156
+ **질문과 답변:**
157
+ - Q: TypeScript 5.4의 NoInfer 유틸리티 타입이 뭐야?
158
+ → A: 제네릭 타입 추론을 특정 위치에서 차단하는 유틸리티 타입...
159
+
160
+ ## Tags
161
+ #my-app #인증 #jwt #blog #seo #typescript
162
+ ```
163
+
164
+ ### 6.2 Weekly (weekly/2026-W13.md)
165
+
166
+ ```markdown
167
+ ---
168
+ date: 2026-W13
169
+ type: weekly-review
170
+ period: 2026-03-24 ~ 2026-03-30
171
+ projects: [my-app, blog]
172
+ ---
173
+
174
+ # 2026-W13 주간 회고
175
+
176
+ ## 주요 성과
177
+ - [my-app] 인증 시스템 JWT 전환 완료
178
+ - [blog] SEO 메타태그 전면 적용
179
+
180
+ ## 기술 스택 활용
181
+ - TypeScript, Next.js, Prisma, JWT, next-auth v5
182
+
183
+ ## 핵심 의사결정
184
+ - JWT vs Session → JWT 선택 (확장성, stateless)
185
+
186
+ ## 성장 포인트
187
+ - next-auth v5 심화 학습
188
+ - OG 이미지 동적 생성 패턴 습득
189
+
190
+ ## 다음 주 이어갈 것
191
+ - 인증 시스템 테스트 보강
192
+ ```
193
+
194
+ ### 6.3 Monthly (monthly/2026-03.md)
195
+
196
+ ```markdown
197
+ ---
198
+ date: 2026-03
199
+ type: monthly-review
200
+ projects: [my-app, blog, api-server]
201
+ ---
202
+
203
+ # 2026년 3월 월간 회고
204
+
205
+ ## 프로젝트별 진행 요약
206
+ ### my-app
207
+ - 인증 시스템 전면 리팩토링 (JWT 전환)
208
+ - 사용자 프로필 페이지 구현
209
+ ### blog
210
+ - SEO 최적화 완료
211
+ - 댓글 시스템 연동
212
+
213
+ ## 이번 달 핵심 성장
214
+ - 인증/보안 도메인 역량 강화
215
+ - Next.js App Router 심화
216
+
217
+ ## 기술 스택
218
+ - TypeScript, Next.js, Prisma, JWT, PostgreSQL
219
+
220
+ ## 주요 의사결정 기록
221
+ - JWT vs Session (W13)
222
+ - SSR vs SSG for blog (W14)
223
+ ```
224
+
225
+ ### 6.4 Quarterly (quarterly/2026-Q1.md)
226
+
227
+ ```markdown
228
+ ---
229
+ date: 2026-Q1
230
+ type: quarterly-review
231
+ period: 2026-01 ~ 2026-03
232
+ ---
233
+
234
+ # 2026 Q1 분기 회고
235
+
236
+ ## 분기 성과 요약
237
+ - my-app: MVP 완성 (인증, 프로필, 대시보드)
238
+ - blog: 런칭 및 SEO 최적화
239
+ - api-server: REST → GraphQL 마이그레이션
240
+
241
+ ## 핵심 역량 성장
242
+ - 인증/보안 설계
243
+ - Next.js 풀스택 개발
244
+ - GraphQL 스키마 설계
245
+
246
+ ## 기술 스택 총괄
247
+ - TypeScript, Next.js, Prisma, JWT, GraphQL, PostgreSQL
248
+
249
+ ## 경력기술서 하이라이트
250
+ - JWT 기반 인증 시스템 설계 및 구현
251
+ - 블로그 플랫폼 SEO 최적화로 검색 노출 기반 마련
252
+ - REST API를 GraphQL로 마이그레이션하여 프론트엔드 쿼리 효율화
253
+ ```
254
+
255
+ ### 6.5 Yearly (yearly/2026.md)
256
+
257
+ ```markdown
258
+ ---
259
+ date: 2026
260
+ type: yearly-review
261
+ ---
262
+
263
+ # 2026 연간 회고
264
+
265
+ ## 연간 프로젝트 총괄
266
+ - my-app: 기획 → MVP → 런칭 → 운영
267
+ - blog: 구축 및 성장
268
+ - api-server: 아키텍처 전환
269
+
270
+ ## 핵심 역량 맵
271
+ - **프론트엔드:** Next.js, React, TypeScript
272
+ - **백엔드:** Node.js, GraphQL, PostgreSQL
273
+ - **인프라:** Docker, AWS, CI/CD
274
+ - **설계:** 인증 시스템, API 설계, 데이터 모델링
275
+
276
+ ## 이력서용 요약
277
+ - ...
278
+
279
+ ## 경력기술서용 상세
280
+ - ...
281
+ ```
282
+
283
+ ### 6.6 Project Summary (projects/{name}/summary.md)
284
+
285
+ ```markdown
286
+ ---
287
+ project: my-app
288
+ type: project-summary
289
+ started: 2026-01-15
290
+ last-updated: 2026-03-28
291
+ tags: [next.js, typescript, prisma, jwt]
292
+ ---
293
+
294
+ # my-app 프로젝트 요약
295
+
296
+ ## 프로젝트 개요
297
+ 개인 대시보드 웹 애플리케이션
298
+
299
+ ## 기술 스택
300
+ - Next.js 14, TypeScript, Prisma, PostgreSQL, JWT
301
+
302
+ ## 주요 구현 사항
303
+ - JWT 기반 인증 시스템 설계 및 구현
304
+ - 사용자 프로필/대시보드 페이지
305
+ - ...
306
+
307
+ ## 핵심 의사결정 로그
308
+ - 2026-02-10: ORM 선택 → Prisma (type-safety)
309
+ - 2026-03-25: JWT vs Session → JWT (scalability)
310
+
311
+ ## 배운 것 (누적)
312
+ - next-auth v5 심화
313
+ - Prisma interactive transaction
314
+ - ...
315
+ ```
316
+
317
+ ## 7. 주기별 요약 생성 체계
318
+
319
+ ### 계단식 요약 구조
320
+
321
+ ```
322
+ daily (raw 로그 + transcript)
323
+ ↓ 입력으로 사용
324
+ weekly (해당 주의 daily들)
325
+ ↓ 입력으로 사용
326
+ monthly (해당 월의 weekly들)
327
+ ↓ 입력으로 사용
328
+ quarterly (해당 분기의 monthly들)
329
+ ↓ 입력으로 사용
330
+ yearly (해당 년의 quarterly들)
331
+ ```
332
+
333
+ 각 단계가 이전 단계의 요약을 입력으로 사용하므로 토큰 비용이 효율적이다.
334
+
335
+ ### 트리거 조건
336
+
337
+ | 주기 | 트리거 시점 | 조건 | 입력 |
338
+ |------|------------|------|------|
339
+ | daily | SessionEnd, SessionStart(복구) | 항상 | raw 로그 + transcript |
340
+ | weekly | SessionStart | 새로운 주 시작 감지 | 지난주 daily 파일들 |
341
+ | monthly | SessionStart | 새로운 달 시작 감지 | 해당 월 weekly 파일들 |
342
+ | quarterly | SessionStart | 새로운 분기 시작 감지 | 해당 분기 monthly 파일들 |
343
+ | yearly | SessionStart | 새로운 해 시작 감지 | 해당 년 quarterly 파일들 |
344
+ | project summary | SessionEnd | 항상 | 기존 summary + 오늘 기록 |
345
+
346
+ ### 활성화 설정
347
+
348
+ 사용자가 config에서 원하는 주기만 활성화할 수 있다. daily는 항상 활성화 (필수).
349
+
350
+ ## 8. 동시성 처리
351
+
352
+ ### 설계 원칙: 쓰기 충돌 자체를 제거한다
353
+
354
+ lockfile 기반 동시성 처리는 stale lock, contention timeout, 네트워크 드라이브 비호환 등 실패 시나리오가 많다. 대신 **세션별 독립 파일 쓰기 + 단일 시점 merge** 전략을 사용한다.
355
+
356
+ ### 문제 시나리오
357
+
358
+ 여러 터미널에서 동시에 Claude Code 세션을 실행할 수 있다:
359
+ - 세션 A: my-app 작업 중
360
+ - 세션 B: blog 작업 중
361
+ - 둘 다 동시에 Stop 훅이 발생
362
+
363
+ ### 해결 전략: 세션 격리 + 지연 merge
364
+
365
+ ```
366
+ Stop (async): .raw/{session-id}/{date}.jsonl에 append ← 세션별 파일, 충돌 없음
367
+ SessionEnd: .reviews/{session-id}.md 생성 ← 세션별 파일, 충돌 없음
368
+ SessionStart: .reviews/*.md → daily.md로 merge ← 단일 프로세스
369
+ ```
370
+
371
+ 1. **raw 로그:** 세션별 독립 파일 (`.raw/{session-id}/{date}.jsonl`) → 충돌 불가
372
+ 2. **세션별 회고:** 세션별 독립 파일 (`.reviews/{session-id}.md`) → 충돌 불가
373
+ 3. **daily/project merge:** SessionStart에서만 수행 → 동시 실행 확률 극히 낮음
374
+ 4. **주기별 요약:** SessionStart에서만 생성 → merge와 동일
375
+
376
+ ### merge 시 최소한의 안전장치
377
+
378
+ SessionStart에서 merge할 때만 `proper-lockfile`을 사용하되, 실패에 안전하게 설계:
379
+
380
+ ```
381
+ merge 플로우:
382
+ 1. lock 획득 시도 (stale: 30초 — 30초 지난 lock은 자동 해제)
383
+ 2. lock 실패 시 → merge 건너뜀 (다음 SessionStart에서 재시도, 데이터 유실 없음)
384
+ 3. lock 성공 시 → .reviews/*.md 읽기 → daily.md에 merge → .reviews/ 정리 → lock 해제
385
+ 4. merge 중 크래시 → stale lock은 다음 세션에서 자동 해제, .reviews/ 원본은 유지
386
+ ```
387
+
388
+ ### 파일 구조
389
+
390
+ ```
391
+ {vaultPath}/{reviewFolder}/
392
+ ├── .raw/{session-id}/{date}.jsonl ← Stop 훅이 append (세션별)
393
+ ├── .reviews/{session-id}.md ← SessionEnd가 생성 (세션별)
394
+ ├── daily/2026-03-28.md ← SessionStart에서 merge
395
+ └── ...
396
+ ```
397
+
398
+ ### 핵심: 데이터는 항상 안전하다
399
+
400
+ 어떤 시나리오에서도 `.raw/`와 `.reviews/`의 원본 데이터는 유실되지 않는다. merge는 "있으면 좋은 것"이고, 실패해도 다음 기회에 재시도된다.
401
+
402
+ ## 9. 강제종료 복구
403
+
404
+ ### 복구 판단 기준
405
+
406
+ 각 raw 로그 세션 디렉토리에 `.completed` 마커 파일 존재 여부로 판단:
407
+ - SessionEnd 훅에서 세션별 회고 생성 완료 후 `.completed` 생성
408
+ - SessionStart에서 `.completed` 없는 세션 디렉토리 → 미처리로 간주 → 복구
409
+ - `.reviews/`에 남아있는 파일 → 미merge로 간주 → merge 실행
410
+
411
+ ### 복구 플로우
412
+
413
+ ```
414
+ SessionStart
415
+ → 1) .raw/ 스캔: .completed 없는 세션 발견 → raw 로그 기반 회고 생성 → .reviews/에 저장
416
+ → 2) .reviews/ 스캔: 미merge 파일 발견 → daily.md에 merge
417
+ → 3) 주기별 요약 필요 여부 확인 → 생성
418
+ ```
419
+
420
+ ### 실패 시나리오별 보장
421
+
422
+ | 시나리오 | raw 로그 | 세션 회고 | daily merge | 복구 방법 |
423
+ |----------|----------|-----------|-------------|-----------|
424
+ | 정상 종료 | O | O | O | - |
425
+ | 강제종료 (Stop까지 실행됨) | O | X | X | 다음 SessionStart에서 raw → 회고 → merge |
426
+ | 강제종료 (Stop도 안 됨) | 직전 Stop까지 O | X | X | 다음 SessionStart에서 부분 복구 |
427
+ | SessionEnd 중 크래시 | O | 부분 | X | 다음 SessionStart에서 재생성 |
428
+ | SessionStart merge 중 크래시 | O | O (.reviews/) | X | 다음 SessionStart에서 재merge |
429
+ | lockfile stale | O | O (.reviews/) | X | stale 자동 해제 후 재시도 |
430
+
431
+ ## 10. 설정
432
+
433
+ ### 설정 파일 위치
434
+
435
+ `$CLAUDE_PLUGIN_DATA/config.json`
436
+
437
+ ### 설정 스키마
438
+
439
+ ```json
440
+ {
441
+ "vaultPath": "/path/to/obsidian/vault",
442
+ "reviewFolder": "daily-review",
443
+ "language": "ko",
444
+ "periods": {
445
+ "daily": true,
446
+ "weekly": true,
447
+ "monthly": true,
448
+ "quarterly": true,
449
+ "yearly": false
450
+ },
451
+ "profile": {
452
+ "company": "ABC Corp",
453
+ "role": "프론트엔드 개발자",
454
+ "team": "결제플랫폼팀",
455
+ "context": "B2B SaaS 결제 시스템 개발 및 운영"
456
+ }
457
+ }
458
+ ```
459
+
460
+ | 필드 | 타입 | 기본값 | 설명 |
461
+ |------|------|--------|------|
462
+ | `vaultPath` | string | (필수) | Obsidian vault 절대 경로 |
463
+ | `reviewFolder` | string | `"daily-review"` | vault 내 회고 저장 폴더명 |
464
+ | `language` | string | `"ko"` | 회고 생성 언어 (ko, en, ja 등) |
465
+ | `periods.daily` | boolean | `true` | 일별 회고 (항상 true, 변경 불가) |
466
+ | `periods.weekly` | boolean | `true` | 주간 요약 활성화 |
467
+ | `periods.monthly` | boolean | `true` | 월간 요약 활성화 |
468
+ | `periods.quarterly` | boolean | `true` | 분기 요약 활성화 |
469
+ | `periods.yearly` | boolean | `false` | 연간 요약 활성화 |
470
+ | `profile.company` | string | `""` | 회사명 |
471
+ | `profile.role` | string | `""` | 직무/역할 |
472
+ | `profile.team` | string | `""` | 팀명 또는 담당 도메인 |
473
+ | `profile.context` | string | `""` | 하는 일 한 줄 설명 |
474
+
475
+ ### profile의 활용
476
+
477
+ profile 정보는 agent 훅이 요약을 생성할 때 프롬프트에 포함된다. 이를 통해:
478
+ - 작업 요약에 비즈니스 맥락이 반영됨 (예: "JWT 구현" → "B2B SaaS 멀티테넌트 환경에서 JWT 기반 인증 설계")
479
+ - 경력기술서/이력서에 바로 쓸 수 있는 수준의 표현 생성
480
+ - 프로젝트 summary에 도메인 맥락 포함
481
+
482
+ ## 11. 설치 및 설정 플로우
483
+
484
+ ```
485
+ 1. 설치
486
+ $ claude plugin add claude-daily-review
487
+
488
+ 2. 첫 세션 시작
489
+ → SessionStart 훅 실행
490
+ → config.json 없음 감지
491
+ → Claude에게 피드백: "daily-review: vault 경로가 설정되지 않았습니다.
492
+ /daily-review-setup 을 실행해주세요."
493
+
494
+ 3. 설정 (온보딩)
495
+ 사용자: /daily-review-setup
496
+ → 1단계: "Obsidian vault 경로를 알려주세요"
497
+ → 경로 입력 → 유효성 검증 (디렉토리 존재 여부)
498
+ → 2단계: 간단한 자기소개 (profile)
499
+ → "어떤 회사에서 일하고 계신가요?"
500
+ → "역할/직무가 뭔가요?"
501
+ → "팀이나 담당 도메인이 있다면?"
502
+ → "하고 계신 일을 한 줄로 설명하면?"
503
+ → 3단계: 주기 설정 (기본값 제안)
504
+ → config.json 저장
505
+ → 필요한 하위 디렉토리 자동 생성
506
+
507
+ 4. 재설정
508
+ 사용자: /daily-review-setup
509
+ → 기존 설정 표시 → 변경할 항목 선택 → 저장
510
+ ```
511
+
512
+ ## 12. hooks/hooks.json
513
+
514
+ ```json
515
+ {
516
+ "hooks": {
517
+ "Stop": [
518
+ {
519
+ "hooks": [
520
+ {
521
+ "type": "command",
522
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/dist/hooks/on-stop.js\"",
523
+ "async": true,
524
+ "timeout": 10
525
+ }
526
+ ]
527
+ }
528
+ ],
529
+ "SessionEnd": [
530
+ {
531
+ "hooks": [
532
+ {
533
+ "type": "agent",
534
+ "prompt": "You are a daily review generator. Read the transcript at the given path and generate structured review markdown files. Follow the instructions in ${CLAUDE_PLUGIN_ROOT}/dist/hooks/on-session-end-prompt.md",
535
+ "timeout": 120
536
+ }
537
+ ]
538
+ }
539
+ ],
540
+ "SessionStart": [
541
+ {
542
+ "hooks": [
543
+ {
544
+ "type": "agent",
545
+ "prompt": "You are a daily review assistant. Check config, recover unprocessed logs, and generate periodic summaries if needed. Follow the instructions in ${CLAUDE_PLUGIN_ROOT}/dist/hooks/on-session-start-prompt.md",
546
+ "timeout": 120
547
+ }
548
+ ]
549
+ }
550
+ ]
551
+ }
552
+ }
553
+ ```
554
+
555
+ ## 13. 기술 스택
556
+
557
+ - **런타임:** Node.js (Claude Code 환경에서 보장)
558
+ - **언어:** TypeScript
559
+ - **빌드:** tsup 또는 esbuild (dist/ 출력)
560
+ - **동시성:** 세션 격리 패턴 + proper-lockfile (merge 시에만 최소 사용)
561
+ - **패키지 매니저:** npm
562
+ - **배포:** npm registry (claude plugin add로 설치)
563
+
564
+ ## 14. 스코프 정의
565
+
566
+ ### 1차 스코프 (MVP)
567
+
568
+ - Stop 훅으로 raw 로그 수집
569
+ - SessionEnd 훅으로 daily 회고 생성 (agent)
570
+ - SessionStart 훅으로 복구 + 주기별 요약 생성
571
+ - /daily-review-setup 온보딩 (vault 경로 + profile + 주기 설정)
572
+ - profile 기반 맥락 있는 요약 생성
573
+ - 동시성 처리 (lockfile)
574
+ - 프로젝트별 분류 + 미분류 처리
575
+ - 설정 가능한 주기 (daily/weekly/monthly/quarterly/yearly)
576
+
577
+ ### 2차 스코프 (향후)
578
+
579
+ - MCP 서버 어댑터 (Claude Desktop 지원)
580
+ - 조회 도구 ("오늘 회고 보여줘", "이번 주 요약")
581
+ - 커스텀 마크다운 템플릿
582
+ - Obsidian 태그/링크 자동 연결 강화