@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.
- package/.claude-plugin/marketplace.json +29 -0
- package/.github/workflows/publish.yml +24 -0
- package/.github/workflows/update-marketplace.yml +28 -0
- package/docs/superpowers/plans/2026-03-28-claude-daily-review-plan.md +2130 -0
- package/docs/superpowers/plans/2026-03-28-no-build-refactor-plan.md +1158 -0
- package/docs/superpowers/plans/2026-03-28-storage-adapter-refactor-plan.md +2207 -0
- package/docs/superpowers/specs/2026-03-28-claude-daily-review-design.md +582 -0
- package/docs/superpowers/specs/2026-03-28-no-build-refactor-design.md +333 -0
- package/docs/superpowers/specs/2026-03-28-storage-adapter-refactor-design.md +365 -0
- package/hooks/hooks.json +3 -2
- package/hooks/on-stop.mjs +24 -0
- package/hooks/run-hook.cmd +27 -0
- package/hooks/session-start-check +27 -0
- package/lib/config.mjs +122 -0
- package/lib/github-auth.mjs +44 -0
- package/lib/github-storage.mjs +81 -0
- package/lib/merge.mjs +51 -0
- package/lib/periods.mjs +82 -0
- package/lib/raw-logger.mjs +19 -0
- package/lib/storage-cli.mjs +48 -0
- package/lib/storage.mjs +63 -0
- package/lib/types.d.ts +64 -0
- package/lib/vault.mjs +43 -0
- package/package.json +3 -23
- package/prompts/session-end.md +5 -5
- package/prompts/session-start.md +5 -5
- package/dist/on-session-start-check.js +0 -56
- package/dist/on-session-start-check.js.map +0 -1
- package/dist/on-stop.js +0 -274
- package/dist/on-stop.js.map +0 -1
- package/dist/storage-cli.js +0 -267
- package/dist/storage-cli.js.map +0 -1
|
@@ -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 태그/링크 자동 연결 강화
|