@giwonn/claude-daily-review 0.3.2 → 0.3.5
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 +1 -1
- package/.github/workflows/release.yml +69 -0
- package/README.ko.md +28 -13
- package/README.md +38 -21
- package/commands/daily-review-setup.md +136 -76
- package/commands/generate.md +195 -0
- package/hooks/hooks.json +6 -11
- package/hooks/on-stop.mjs +58 -2
- package/hooks/recover-sessions.mjs +179 -0
- package/hooks/run-hook.cmd +0 -0
- package/hooks/session-start-check +1 -9
- package/lib/check-config.mjs +8 -0
- package/lib/collect-raw-logs.mjs +153 -0
- package/lib/config.mjs +1 -1
- package/lib/create-dirs.mjs +13 -0
- package/lib/github-storage.mjs +1 -1
- package/lib/poll-token.mjs +5 -0
- package/lib/raw-logger.mjs +16 -2
- package/lib/request-device-code.mjs +4 -0
- package/package.json +1 -1
- package/.github/workflows/publish.yml +0 -24
- package/.github/workflows/update-marketplace.yml +0 -28
- package/prompts/session-end.md +0 -233
- package/prompts/session-start.md +0 -358
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"source": {
|
|
14
14
|
"source": "url",
|
|
15
15
|
"url": "https://github.com/giwonn/claude-daily-review.git",
|
|
16
|
-
"sha": "
|
|
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
|
|
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 —
|
|
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
|
-
- **
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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,
|
|
@@ -7,46 +7,48 @@ allowed-tools: ["AskUserQuestion", "Read", "Write", "Bash"]
|
|
|
7
7
|
|
|
8
8
|
You are setting up the claude-daily-review plugin for the user.
|
|
9
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
|
+
|
|
10
16
|
## Check Existing Config
|
|
11
17
|
|
|
12
18
|
First, read `${CLAUDE_PLUGIN_DATA}/config.json` to see if a config already exists.
|
|
13
19
|
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
16
34
|
|
|
17
35
|
## Onboarding Flow
|
|
18
36
|
|
|
19
37
|
### Step 0: Storage Selection
|
|
20
38
|
|
|
21
|
-
Ask the user:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
39
|
+
Ask the user using AskUserQuestion:
|
|
40
|
+
- question: "회고를 어디에 저장할까요?"
|
|
41
|
+
- options:
|
|
42
|
+
1. label: "GitHub 저장소", description: "원격 저장소에 저장. 여러 PC에서 공유 가능"
|
|
43
|
+
2. label: "로컬 폴더", description: "Obsidian vault 등 로컬 디렉토리에 저장"
|
|
25
44
|
|
|
26
|
-
#### Option 1:
|
|
45
|
+
#### Option 1: GitHub Storage
|
|
27
46
|
|
|
28
|
-
|
|
29
|
-
```json
|
|
30
|
-
{
|
|
31
|
-
"storage": {
|
|
32
|
-
"type": "local",
|
|
33
|
-
"local": {
|
|
34
|
-
"basePath": "<path>/daily-review"
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
#### Option 2: GitHub Storage
|
|
41
|
-
|
|
42
|
-
**2a. Authenticate with GitHub OAuth Device Flow:**
|
|
47
|
+
**1a. Authenticate with GitHub OAuth Device Flow:**
|
|
43
48
|
|
|
44
49
|
Run via Bash:
|
|
45
50
|
```bash
|
|
46
|
-
node -
|
|
47
|
-
const { requestDeviceCode } = require('${CLAUDE_PLUGIN_ROOT}/dist/core/github-auth.js');
|
|
48
|
-
requestDeviceCode().then(r => console.log(JSON.stringify(r)));
|
|
49
|
-
"
|
|
51
|
+
node "${CLAUDE_PLUGIN_ROOT}/lib/request-device-code.mjs"
|
|
50
52
|
```
|
|
51
53
|
|
|
52
54
|
Show the user:
|
|
@@ -54,31 +56,41 @@ Show the user:
|
|
|
54
56
|
> - URL: https://github.com/login/device
|
|
55
57
|
> - 코드: `{user_code}`
|
|
56
58
|
|
|
57
|
-
Then poll for the token:
|
|
59
|
+
Then poll for the token (pass the full device code response as JSON argument):
|
|
58
60
|
```bash
|
|
59
|
-
node -
|
|
60
|
-
const { pollForToken } = require('${CLAUDE_PLUGIN_ROOT}/dist/core/github-auth.js');
|
|
61
|
-
pollForToken('{device_code}', {interval}).then(r => console.log(JSON.stringify(r)));
|
|
62
|
-
"
|
|
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}'
|
|
63
62
|
```
|
|
64
63
|
|
|
65
|
-
Wait for the user to complete authorization. Store the returned
|
|
64
|
+
Wait for the user to complete authorization. Store the returned token string.
|
|
66
65
|
|
|
67
|
-
**
|
|
66
|
+
**1b. Select or create a repository:**
|
|
68
67
|
|
|
69
|
-
Ask:
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
Ask using AskUserQuestion:
|
|
69
|
+
- question: "GitHub 저장소를 어떻게 할까요?"
|
|
70
|
+
- options:
|
|
71
|
+
1. label: "새 저장소 만들기", description: "비공개 저장소를 자동 생성합니다"
|
|
72
|
+
2. label: "기존 저장소 사용", description: "이미 있는 저장소를 지정합니다"
|
|
73
73
|
|
|
74
|
-
- **Existing:** Ask for the repository in `owner/repo` format. Parse into `owner` and `repo`.
|
|
75
74
|
- **New:** Ask for a repo name. Create it via Bash:
|
|
76
75
|
```bash
|
|
77
|
-
gh api /user/repos -X POST -f name=<name> -f private=true
|
|
76
|
+
MSYS_NO_PATHCONV=1 gh api /user/repos -X POST -f name=<name> -f private=true
|
|
78
77
|
```
|
|
79
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).
|
|
80
92
|
|
|
81
|
-
The
|
|
93
|
+
The local config will be:
|
|
82
94
|
```json
|
|
83
95
|
{
|
|
84
96
|
"storage": {
|
|
@@ -93,8 +105,24 @@ The storage config will be:
|
|
|
93
105
|
}
|
|
94
106
|
```
|
|
95
107
|
|
|
108
|
+
The profile/periods/language go into the **shared config** (saved in Step 4).
|
|
109
|
+
|
|
96
110
|
After storage selection, proceed to Step 2 (Profile). Skip Step 1 (Vault Path) for GitHub storage.
|
|
97
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
|
+
|
|
98
126
|
### Step 1: Vault Path (Local storage only)
|
|
99
127
|
|
|
100
128
|
Ask the user:
|
|
@@ -108,60 +136,91 @@ After they provide a path:
|
|
|
108
136
|
|
|
109
137
|
### Step 2: Profile
|
|
110
138
|
|
|
111
|
-
Ask
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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: "나중에 설정할 수 있습니다"
|
|
116
166
|
|
|
117
167
|
### Step 3: Periods
|
|
118
168
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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.
|
|
126
179
|
|
|
127
180
|
### Step 4: Save
|
|
128
181
|
|
|
129
|
-
|
|
182
|
+
**Save local config** to `${CLAUDE_PLUGIN_DATA}/config.json` using the Write tool.
|
|
130
183
|
|
|
131
|
-
|
|
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
|
+
```
|
|
132
193
|
|
|
194
|
+
For **GitHub storage**, the local config only has storage credentials:
|
|
133
195
|
```json
|
|
134
196
|
{
|
|
135
|
-
"storage": { ... },
|
|
197
|
+
"storage": { "type": "github", "github": { "owner": "...", "repo": "...", "token": "...", "basePath": "daily-review" } },
|
|
136
198
|
"language": "ko",
|
|
137
199
|
"periods": { "daily": true, "weekly": true, "monthly": true, "quarterly": true, "yearly": false },
|
|
138
|
-
"profile": {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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": "..." }
|
|
144
215
|
}
|
|
145
216
|
```
|
|
146
217
|
|
|
147
|
-
**If local storage:** Create the vault directories
|
|
218
|
+
**If local storage:** Create the vault directories:
|
|
148
219
|
```bash
|
|
149
|
-
node -
|
|
150
|
-
const fs = require('fs');
|
|
151
|
-
const path = require('path');
|
|
152
|
-
const config = JSON.parse(fs.readFileSync('${CLAUDE_PLUGIN_DATA}/config.json', 'utf-8'));
|
|
153
|
-
const base = config.storage.local.basePath;
|
|
154
|
-
const dirs = ['daily', 'projects', 'uncategorized', '.raw', '.reviews'];
|
|
155
|
-
if (config.periods.weekly) dirs.push('weekly');
|
|
156
|
-
if (config.periods.monthly) dirs.push('monthly');
|
|
157
|
-
if (config.periods.quarterly) dirs.push('quarterly');
|
|
158
|
-
if (config.periods.yearly) dirs.push('yearly');
|
|
159
|
-
dirs.forEach(d => fs.mkdirSync(path.join(base, d), { recursive: true }));
|
|
160
|
-
console.log('Directories created at: ' + base);
|
|
161
|
-
"
|
|
220
|
+
node "${CLAUDE_PLUGIN_ROOT}/lib/create-dirs.mjs"
|
|
162
221
|
```
|
|
163
222
|
|
|
164
|
-
**If GitHub storage:** Skip directory creation.
|
|
223
|
+
**If GitHub storage:** Skip directory creation.
|
|
165
224
|
|
|
166
225
|
### Step 5: Confirm
|
|
167
226
|
|
|
@@ -176,3 +235,4 @@ Tell the user:
|
|
|
176
235
|
> "설정 완료! 이제부터 대화 내용이 자동으로 GitHub에 기록됩니다."
|
|
177
236
|
> "회고 파일은 `https://github.com/{owner}/{repo}` 에서 확인하세요."
|
|
178
237
|
> "설정을 변경하려면 `/daily-review-setup`을 다시 실행하세요."
|
|
238
|
+
> "다른 PC에서도 GitHub 인증만 하면 설정이 자동으로 복원됩니다."
|