@giwonn/claude-daily-review 0.3.2 → 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": "b47a5947c8803fa318c9a1d0c52848db252c9869"
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,
@@ -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
- - If it exists, show the current settings and ask what the user wants to change.
15
- - If it does not exist, proceed with the full onboarding flow below.
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
- > 1. 로컬 폴더 (Obsidian vault 등)
24
- > 2. GitHub 저장소
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: Local Storage
45
+ #### Option 1: GitHub Storage
27
46
 
28
- Proceed to Step 1 (Vault Path) below. The storage config will be:
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 -e "
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 -e "
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 `access_token`.
64
+ Wait for the user to complete authorization. Store the returned token string.
66
65
 
67
- **2b. Select or create a repository:**
66
+ **1b. Select or create a repository:**
68
67
 
69
- Ask:
70
- > "기존 GitHub 저장소를 사용할까요, 새로 만들까요?"
71
- > 1. 기존 저장소 사용
72
- > 2. 새 저장소 만들기
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 storage config will be:
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 the user these questions one at a time:
112
- 1. "어떤 회사에서 일하고 계신가요? (선택사항, 엔터로 건너뛰기)"
113
- 2. "역할/직무가 뭔가요? (예: 프론트엔드 개발자)"
114
- 3. "팀이나 담당 도메인이 있다면? (예: 결제플랫폼팀)"
115
- 4. "하고 계신 일을 한 줄로 설명하면? (예: B2B SaaS 결제 시스템 개발 및 운영)"
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
- Show the available periods and defaults:
120
- > "어떤 주기로 회고를 요약할까요? (기본값으로 진행하려면 엔터)"
121
- > - [x] daily (항상 활성화)
122
- > - [x] weekly (주간)
123
- > - [x] monthly (월간)
124
- > - [x] quarterly (분기)
125
- > - [ ] yearly (연간)
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
- Construct the config JSON and write it to `${CLAUDE_PLUGIN_DATA}/config.json` using the Write tool.
182
+ **Save local config** to `${CLAUDE_PLUGIN_DATA}/config.json` using the Write tool.
130
183
 
131
- The config format is:
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
- "company": "...",
140
- "role": "...",
141
- "team": "...",
142
- "context": "..."
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 by running via Bash:
218
+ **If local storage:** Create the vault directories:
148
219
  ```bash
149
- node -e "
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. Directories are created implicitly when files are written to the GitHub repository.
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 인증만 하면 설정이 자동으로 복원됩니다."