companionbot 0.15.0 → 0.15.1
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/README.md +93 -264
- package/dist/tools/pathCheck.js +3 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,327 +1,156 @@
|
|
|
1
1
|
# CompanionBot
|
|
2
2
|
|
|
3
|
-
> Claude
|
|
3
|
+
> Claude 기반 개인 AI 친구 - 텔레그램 봇
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/companionbot)
|
|
6
6
|
[](https://nodejs.org)
|
|
7
7
|
[](https://opensource.org/licenses/MIT)
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## ✨ 특징
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
11
|
+
- 🧠 **Extended Thinking** - Claude의 사고 과정 활용
|
|
12
|
+
- 🔍 **시맨틱 메모리** - 로컬 임베딩으로 관련 기억 검색
|
|
13
|
+
- ⚡ **빠른 응답** - 사전 로딩, 병렬 처리, 스마트 캐싱
|
|
14
|
+
- 🎭 **페르소나** - 이름, 성격, 말투 커스터마이징
|
|
15
|
+
- 🔧 **20+ 도구** - 파일, 웹, 일정, 메모리 등
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
- **웹 검색** - "최신 React 뉴스 검색해줘" (Brave Search API)
|
|
19
|
-
- **웹 페이지 읽기** - URL 내용을 가져와서 분석/요약
|
|
20
|
-
|
|
21
|
-
### ⏰ 일정 관리
|
|
22
|
-
- **리마인더** - "10분 뒤에 알려줘"
|
|
23
|
-
- **Google Calendar 연동** - 일정 조회/추가/삭제
|
|
24
|
-
- **일일 브리핑** - 매일 아침 날씨와 일정 알림
|
|
25
|
-
- **Heartbeat** - 주기적으로 체크리스트 확인 후 알림
|
|
26
|
-
|
|
27
|
-
### 🕐 스케줄링 (v0.3.0)
|
|
28
|
-
- **Cron 작업** - "매일 아침 9시에 뉴스 알려줘", "평일 오후 6시에 퇴근 알림"
|
|
29
|
-
- **일회성 예약** - "내일 오전 9시에 알려줘"
|
|
30
|
-
- **반복 작업** - "30분마다 주식 가격 확인해줘"
|
|
31
|
-
|
|
32
|
-
### 🤖 고급 기능 (v0.3.0+)
|
|
33
|
-
- **서브 에이전트** - 복잡한 작업을 백그라운드에서 처리
|
|
34
|
-
- **백그라운드 실행** - 긴 명령어를 백그라운드에서 실행하고 결과 확인
|
|
35
|
-
- **파일 시스템** - 워크스페이스 내 파일 읽기/쓰기/편집
|
|
36
|
-
- **일일 메모리** - 대화 내용 자동 저장
|
|
37
|
-
|
|
38
|
-
### 🧠 시맨틱 메모리 (v0.6.0)
|
|
39
|
-
- **벡터 검색** - 임베딩 기반 관련 메모리 검색
|
|
40
|
-
- **자동 인덱싱** - 메모리 파일 자동 청크 분할 및 임베딩
|
|
41
|
-
- **유사도 매칭** - 의미 기반으로 관련 대화 기록 찾기
|
|
42
|
-
|
|
43
|
-
### 🔧 시스템 (v0.6.0)
|
|
44
|
-
- **헬스 체크** - 봇 상태 모니터링 (uptime, 메시지 수, 오류 수)
|
|
45
|
-
- **업데이트 알림** - 새 버전 출시 시 자동 알림
|
|
46
|
-
|
|
47
|
-
## 설치
|
|
48
|
-
|
|
49
|
-
### 사전 준비
|
|
50
|
-
|
|
51
|
-
- **Node.js 18+** ([다운로드](https://nodejs.org))
|
|
52
|
-
- **Telegram Bot Token** - [@BotFather](https://t.me/BotFather)에서 봇 생성 후 발급
|
|
53
|
-
- **Anthropic API Key** - [console.anthropic.com](https://console.anthropic.com)에서 발급
|
|
54
|
-
|
|
55
|
-
#### Linux 사용자 (keytar 의존성)
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
# Debian/Ubuntu
|
|
59
|
-
sudo apt-get install libsecret-1-dev
|
|
60
|
-
|
|
61
|
-
# Fedora
|
|
62
|
-
sudo dnf install libsecret-devel
|
|
63
|
-
|
|
64
|
-
# Arch
|
|
65
|
-
sudo pacman -S libsecret
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### 간편 설치
|
|
17
|
+
## 🚀 빠른 시작
|
|
69
18
|
|
|
70
19
|
```bash
|
|
71
20
|
npm install -g companionbot
|
|
72
21
|
companionbot
|
|
73
22
|
```
|
|
74
23
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
cd companionbot
|
|
80
|
-
npm install
|
|
81
|
-
npm run build
|
|
82
|
-
npm start
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
## 첫 실행
|
|
24
|
+
첫 실행 시 안내에 따라:
|
|
25
|
+
1. Telegram Bot Token 입력 ([@BotFather](https://t.me/BotFather))
|
|
26
|
+
2. Anthropic API Key 입력 ([console.anthropic.com](https://console.anthropic.com))
|
|
27
|
+
3. Telegram에서 봇에게 `/start` 보내기
|
|
86
28
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
🤖 CompanionBot 첫 실행입니다!
|
|
91
|
-
|
|
92
|
-
[1/2] Telegram Bot Token
|
|
93
|
-
@BotFather에서 봇 생성 후 토큰을 붙여넣으세요.
|
|
94
|
-
Token: _
|
|
95
|
-
|
|
96
|
-
[2/2] Anthropic API Key
|
|
97
|
-
console.anthropic.com에서 발급받으세요.
|
|
98
|
-
API Key: _
|
|
99
|
-
|
|
100
|
-
📁 워크스페이스 생성 중...
|
|
101
|
-
→ ~/.companionbot/ 생성 완료
|
|
102
|
-
|
|
103
|
-
🚀 봇을 시작합니다!
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
설정 완료 후 **Telegram에서 봇에게 `/start`를 보내면** 온보딩이 시작됩니다:
|
|
107
|
-
- 봇 이름 짓기
|
|
108
|
-
- 성격과 말투 설정
|
|
109
|
-
- 사용자 정보 입력
|
|
110
|
-
|
|
111
|
-
## 명령어
|
|
112
|
-
|
|
113
|
-
### 기본 명령어
|
|
29
|
+
## 📱 명령어
|
|
114
30
|
|
|
115
31
|
| 명령어 | 설명 |
|
|
116
32
|
|--------|------|
|
|
117
|
-
| `/
|
|
33
|
+
| `/help` | 도움말 보기 |
|
|
34
|
+
| `/model` | AI 모델 변경 (haiku/sonnet/opus) |
|
|
118
35
|
| `/compact` | 대화 정리 (토큰 절약) |
|
|
119
|
-
| `/memory` | 최근
|
|
120
|
-
| `/
|
|
121
|
-
| `/
|
|
122
|
-
|
|
123
|
-
### 기능 설정
|
|
124
|
-
|
|
125
|
-
| 명령어 | 설명 |
|
|
126
|
-
|--------|------|
|
|
127
|
-
| `/setup` | 전체 기능 설정 메뉴 |
|
|
128
|
-
| `/setup weather` | 날씨 API 설정 |
|
|
129
|
-
| `/setup calendar` | Google Calendar 설정 |
|
|
130
|
-
| `/setup briefing` | 일일 브리핑 설정 |
|
|
131
|
-
| `/setup heartbeat` | Heartbeat 설정 |
|
|
132
|
-
|
|
133
|
-
### 빠른 명령어
|
|
134
|
-
|
|
135
|
-
| 명령어 | 설명 |
|
|
136
|
-
|--------|------|
|
|
137
|
-
| `/briefing` | 일일 브리핑 토글 |
|
|
138
|
-
| `/heartbeat` | Heartbeat 토글 |
|
|
139
|
-
| `/reminders` | 알림 목록 보기 |
|
|
140
|
-
| `/calendar` | 오늘 일정 보기 |
|
|
141
|
-
|
|
142
|
-
### 자연어 명령
|
|
36
|
+
| `/memory` | 최근 기억 보기 |
|
|
37
|
+
| `/health` | 봇 상태 확인 |
|
|
38
|
+
| `/setup` | 전체 기능 설정 |
|
|
143
39
|
|
|
144
|
-
|
|
40
|
+
### 자연어로도 가능
|
|
145
41
|
|
|
146
42
|
```
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
메모리 "이거 기억해둬"
|
|
153
|
-
웹 검색 "React 19 검색해줘" / "최신 뉴스 찾아줘"
|
|
154
|
-
Cron "매일 아침 9시에 뉴스 알려줘" / "평일 오후 6시에 퇴근 알림"
|
|
155
|
-
서브에이전트 "이 코드 분석해줘" (복잡한 작업은 자동으로 서브에이전트 사용)
|
|
43
|
+
"하이쿠로 바꿔줘"
|
|
44
|
+
"10분 뒤에 알려줘"
|
|
45
|
+
"서울 날씨 어때?"
|
|
46
|
+
"React 19 검색해줘"
|
|
47
|
+
"매일 아침 9시에 뉴스 알려줘"
|
|
156
48
|
```
|
|
157
49
|
|
|
158
|
-
##
|
|
50
|
+
## 🔧 주요 기능
|
|
159
51
|
|
|
160
|
-
###
|
|
52
|
+
### AI 엔진
|
|
53
|
+
- **Claude 모델** - Sonnet 4 / Opus 4 / Haiku 3.5
|
|
54
|
+
- **Extended Thinking** - 내부 스트리밍으로 thinking 지원
|
|
55
|
+
- **도구 사용** - 20+ 도구, 병렬 실행
|
|
161
56
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
57
|
+
### 메모리 시스템
|
|
58
|
+
- **로컬 임베딩** - @xenova/transformers
|
|
59
|
+
- **하이브리드 검색** - 벡터 + 키워드 (FTS5)
|
|
60
|
+
- **한국어 최적화** - trigram tokenizer
|
|
165
61
|
|
|
166
|
-
###
|
|
62
|
+
### 일정/알림
|
|
63
|
+
- **리마인더** - 자연어로 알림 설정
|
|
64
|
+
- **Google Calendar** - 일정 조회/추가
|
|
65
|
+
- **Cron** - 반복 작업 스케줄링
|
|
66
|
+
- **브리핑/하트비트** - 주기적 알림
|
|
167
67
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
5. 봇에게 DM으로: `/calendar_setup CLIENT_ID CLIENT_SECRET`
|
|
173
|
-
6. 인증 링크 클릭하여 Google 로그인
|
|
68
|
+
### 성능
|
|
69
|
+
- **Warmup** - 시작 시 사전 로딩
|
|
70
|
+
- **병렬 처리** - 워크스페이스, 도구 실행
|
|
71
|
+
- **LRU 캐시** - 임베딩, 워크스페이스
|
|
174
72
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
1. [Brave Search API](https://api.search.brave.com) 가입
|
|
178
|
-
2. API 키 발급
|
|
179
|
-
3. 터미널에서: `npm run setup brave YOUR_API_KEY`
|
|
180
|
-
|
|
181
|
-
## PM2로 상시 실행
|
|
182
|
-
|
|
183
|
-
```bash
|
|
184
|
-
# PM2 설치
|
|
185
|
-
npm install -g pm2
|
|
186
|
-
|
|
187
|
-
# 봇 시작
|
|
188
|
-
pm2 start npm --name companionbot -- start
|
|
189
|
-
|
|
190
|
-
# 부팅 시 자동 시작
|
|
191
|
-
pm2 startup && pm2 save
|
|
192
|
-
|
|
193
|
-
# 로그 확인
|
|
194
|
-
pm2 logs companionbot
|
|
195
|
-
|
|
196
|
-
# 재시작
|
|
197
|
-
pm2 restart companionbot
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
## 워크스페이스
|
|
73
|
+
## 📁 워크스페이스
|
|
201
74
|
|
|
202
75
|
`~/.companionbot/` 구조:
|
|
203
76
|
|
|
204
77
|
```
|
|
205
|
-
├──
|
|
206
|
-
├──
|
|
207
|
-
├── HEARTBEAT.md # 주기적 체크 항목
|
|
208
|
-
├── IDENTITY.md # 봇 정체성 (이름, 이모지, 소개)
|
|
209
|
-
├── MEMORY.md # 장기 기억
|
|
210
|
-
├── SOUL.md # 봇 성격과 말투
|
|
211
|
-
├── TOOLS.md # 도구 설정 노트
|
|
78
|
+
├── SOUL.md # 봇 성격/말투
|
|
79
|
+
├── IDENTITY.md # 이름, 이모지
|
|
212
80
|
├── USER.md # 사용자 정보
|
|
213
|
-
├──
|
|
214
|
-
├──
|
|
81
|
+
├── MEMORY.md # 장기 기억
|
|
82
|
+
├── AGENTS.md # 행동 지침
|
|
83
|
+
├── HEARTBEAT.md # 주기적 체크 항목
|
|
84
|
+
├── TOOLS.md # 도구 설정
|
|
85
|
+
├── canvas/ # 작업 디렉토리
|
|
215
86
|
└── memory/ # 일일 로그
|
|
216
87
|
└── YYYY-MM-DD.md
|
|
217
88
|
```
|
|
218
89
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
- **SOUL.md** - 봇의 성격, 말투, 관심사 수정
|
|
222
|
-
- **HEARTBEAT.md** - 주기적으로 체크할 항목 설정
|
|
223
|
-
- **AGENTS.md** - 봇의 행동 지침 수정
|
|
90
|
+
## ⚙️ 선택 기능
|
|
224
91
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
92
|
+
### 날씨 (OpenWeatherMap)
|
|
93
|
+
```bash
|
|
94
|
+
companionbot setup weather
|
|
95
|
+
```
|
|
228
96
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
| Linux | libsecret (GNOME Keyring 등) |
|
|
97
|
+
### Google Calendar
|
|
98
|
+
```bash
|
|
99
|
+
companionbot setup calendar
|
|
100
|
+
```
|
|
234
101
|
|
|
235
|
-
|
|
102
|
+
### 웹 검색 (Brave Search)
|
|
103
|
+
```bash
|
|
104
|
+
companionbot setup brave
|
|
105
|
+
```
|
|
236
106
|
|
|
237
|
-
##
|
|
107
|
+
## 🖥️ PM2로 상시 실행
|
|
238
108
|
|
|
239
|
-
|
|
109
|
+
```bash
|
|
110
|
+
npm install -g pm2
|
|
111
|
+
pm2 start companionbot --name bot
|
|
112
|
+
pm2 startup && pm2 save
|
|
113
|
+
```
|
|
240
114
|
|
|
241
|
-
|
|
242
|
-
2. **토큰 확인**: Telegram Bot Token이 정확한지 확인
|
|
243
|
-
3. **로그 확인**: `pm2 logs companionbot` 또는 터미널 출력 확인
|
|
115
|
+
## 🔒 보안
|
|
244
116
|
|
|
245
|
-
|
|
117
|
+
- API 키는 OS 키체인에 저장 (macOS Keychain, Windows Credential Manager, Linux libsecret)
|
|
118
|
+
- 파일 접근 경로 검증 (TOCTOU 방지)
|
|
119
|
+
- 명령어 화이트리스트
|
|
120
|
+
- SSRF 방지
|
|
246
121
|
|
|
247
|
-
|
|
248
|
-
- 잠시 후 다시 시도하거나 API 플랜 업그레이드
|
|
122
|
+
## 🐛 트러블슈팅
|
|
249
123
|
|
|
250
|
-
###
|
|
124
|
+
### 봇이 응답 안 해요
|
|
125
|
+
1. API 키 확인
|
|
126
|
+
2. `tail -f /tmp/companionbot.log` 로그 확인
|
|
251
127
|
|
|
128
|
+
### Linux 설치 오류
|
|
252
129
|
```bash
|
|
253
|
-
# keytar 의존성 설치 필요
|
|
254
130
|
sudo apt-get install libsecret-1-dev # Debian/Ubuntu
|
|
255
131
|
```
|
|
256
132
|
|
|
257
|
-
###
|
|
258
|
-
|
|
259
|
-
1. OAuth 클라이언트 ID가 "데스크톱 앱" 유형인지 확인
|
|
260
|
-
2. 리디렉션 URI에 `http://localhost:3847/oauth2callback` 추가
|
|
261
|
-
3. `/setup calendar off` 후 `/calendar_setup`으로 다시 시도
|
|
262
|
-
|
|
263
|
-
### 온보딩이 다시 안 나와요
|
|
264
|
-
|
|
133
|
+
### 초기화하고 싶어요
|
|
265
134
|
```bash
|
|
266
|
-
|
|
267
|
-
# Telegram에서: /reset
|
|
268
|
-
|
|
269
|
-
# 또는 완전 초기화
|
|
270
|
-
rm -rf ~/.companionbot
|
|
271
|
-
companionbot
|
|
135
|
+
rm -rf ~/.companionbot && companionbot
|
|
272
136
|
```
|
|
273
137
|
|
|
274
|
-
##
|
|
138
|
+
## 📜 버전
|
|
275
139
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
140
|
+
현재: **v0.15.0**
|
|
141
|
+
|
|
142
|
+
주요 변경:
|
|
143
|
+
- 메모리 검색 → 도구 방식 (성능 개선)
|
|
144
|
+
- tools 모듈 분할 (15개 파일)
|
|
145
|
+
- Agent 메모리 누수 방지
|
|
146
|
+
- /help 명령어, 한국어 메시지 통일
|
|
147
|
+
|
|
148
|
+
전체 변경 이력: [CHANGELOG.md](CHANGELOG.md)
|
|
282
149
|
|
|
283
|
-
##
|
|
284
|
-
|
|
285
|
-
### v0.6.0 (현재)
|
|
286
|
-
- 🧠 시맨틱 메모리 검색 (임베딩 기반)
|
|
287
|
-
- 💚 헬스 체크 모니터링
|
|
288
|
-
- 🔄 자동 업데이트 알림
|
|
289
|
-
|
|
290
|
-
### v0.5.0
|
|
291
|
-
- 🔒 보안 강화 (SSRF 방지, 경로 검증)
|
|
292
|
-
- ✅ 테스트 추가 (vitest)
|
|
293
|
-
- 📖 문서 개선
|
|
294
|
-
|
|
295
|
-
### v0.4.0
|
|
296
|
-
- 🛡️ 보안 강화 (TOCTOU, 심볼릭 링크 검증)
|
|
297
|
-
- 🧹 세션 자동 정리
|
|
298
|
-
- 🔧 환경변수 기반 경로 설정
|
|
299
|
-
|
|
300
|
-
### v0.3.0
|
|
301
|
-
- 🔍 웹 검색 (Brave Search API)
|
|
302
|
-
- 🕐 Cron 스케줄링 (한국어 지원)
|
|
303
|
-
- 🤖 서브 에이전트 (백그라운드 작업)
|
|
304
|
-
- 🖥️ 백그라운드 명령어 실행
|
|
305
|
-
- 📝 파일 편집 도구 추가
|
|
306
|
-
|
|
307
|
-
### v0.2.0
|
|
308
|
-
- 📅 Google Calendar 연동
|
|
309
|
-
- ☀️ 일일 브리핑
|
|
310
|
-
- 💓 Heartbeat 시스템
|
|
311
|
-
- 🌤️ 날씨 조회
|
|
312
|
-
|
|
313
|
-
### v0.1.0
|
|
314
|
-
- 🚀 초기 릴리스
|
|
315
|
-
- 💬 Claude 기반 대화
|
|
316
|
-
- 🎭 페르소나 온보딩
|
|
317
|
-
- ⏰ 리마인더
|
|
318
|
-
- 🖼️ 이미지 분석
|
|
319
|
-
- 🔗 링크 요약
|
|
320
|
-
|
|
321
|
-
## 라이선스
|
|
150
|
+
## 📄 라이선스
|
|
322
151
|
|
|
323
152
|
[MIT](LICENSE)
|
|
324
153
|
|
|
325
154
|
---
|
|
326
155
|
|
|
327
|
-
|
|
156
|
+
**Issues**: [github.com/DinN0000/CompanionBot/issues](https://github.com/DinN0000/CompanionBot/issues)
|
package/dist/tools/pathCheck.js
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import * as fsSync from "fs";
|
|
6
6
|
import * as path from "path";
|
|
7
|
-
import { getWorkspacePath } from "../workspace/index.js";
|
|
8
7
|
// 홈 디렉토리
|
|
9
8
|
const home = process.env.HOME || "";
|
|
10
9
|
// 위험한 파일 패턴
|
|
@@ -21,12 +20,12 @@ export const DANGEROUS_PATTERNS = [
|
|
|
21
20
|
];
|
|
22
21
|
/**
|
|
23
22
|
* 허용된 디렉토리 목록 반환
|
|
23
|
+
* OpenClaw 스타일: 홈 디렉토리 전체 접근 가능
|
|
24
24
|
*/
|
|
25
25
|
export function getAllowedPaths() {
|
|
26
26
|
return [
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
getWorkspacePath(),
|
|
27
|
+
home, // 홈 디렉토리 전체
|
|
28
|
+
"/tmp", // 임시 디렉토리
|
|
30
29
|
];
|
|
31
30
|
}
|
|
32
31
|
/**
|