claude-remote-guard 1.0.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.
Files changed (82) hide show
  1. package/README.md +433 -0
  2. package/dist/bin/cli.d.ts +3 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +427 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/bin/hook.d.ts +3 -0
  7. package/dist/bin/hook.d.ts.map +1 -0
  8. package/dist/bin/hook.js +136 -0
  9. package/dist/bin/hook.js.map +1 -0
  10. package/dist/index.d.ts +6 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +6 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/claude-settings.d.ts +11 -0
  15. package/dist/lib/claude-settings.d.ts.map +1 -0
  16. package/dist/lib/claude-settings.js +96 -0
  17. package/dist/lib/claude-settings.js.map +1 -0
  18. package/dist/lib/config.d.ts +47 -0
  19. package/dist/lib/config.d.ts.map +1 -0
  20. package/dist/lib/config.js +177 -0
  21. package/dist/lib/config.js.map +1 -0
  22. package/dist/lib/edge-function.d.ts +14 -0
  23. package/dist/lib/edge-function.d.ts.map +1 -0
  24. package/dist/lib/edge-function.js +521 -0
  25. package/dist/lib/edge-function.js.map +1 -0
  26. package/dist/lib/firebase.d.ts +27 -0
  27. package/dist/lib/firebase.d.ts.map +1 -0
  28. package/dist/lib/firebase.js +136 -0
  29. package/dist/lib/firebase.js.map +1 -0
  30. package/dist/lib/messenger/base.d.ts +6 -0
  31. package/dist/lib/messenger/base.d.ts.map +1 -0
  32. package/dist/lib/messenger/base.js +34 -0
  33. package/dist/lib/messenger/base.js.map +1 -0
  34. package/dist/lib/messenger/factory.d.ts +15 -0
  35. package/dist/lib/messenger/factory.d.ts.map +1 -0
  36. package/dist/lib/messenger/factory.js +37 -0
  37. package/dist/lib/messenger/factory.js.map +1 -0
  38. package/dist/lib/messenger/index.d.ts +7 -0
  39. package/dist/lib/messenger/index.d.ts.map +1 -0
  40. package/dist/lib/messenger/index.js +9 -0
  41. package/dist/lib/messenger/index.js.map +1 -0
  42. package/dist/lib/messenger/slack.d.ts +14 -0
  43. package/dist/lib/messenger/slack.d.ts.map +1 -0
  44. package/dist/lib/messenger/slack.js +169 -0
  45. package/dist/lib/messenger/slack.js.map +1 -0
  46. package/dist/lib/messenger/telegram.d.ts +15 -0
  47. package/dist/lib/messenger/telegram.d.ts.map +1 -0
  48. package/dist/lib/messenger/telegram.js +120 -0
  49. package/dist/lib/messenger/telegram.js.map +1 -0
  50. package/dist/lib/messenger/types.d.ts +21 -0
  51. package/dist/lib/messenger/types.d.ts.map +1 -0
  52. package/dist/lib/messenger/types.js +2 -0
  53. package/dist/lib/messenger/types.js.map +1 -0
  54. package/dist/lib/messenger/whatsapp.d.ts +16 -0
  55. package/dist/lib/messenger/whatsapp.d.ts.map +1 -0
  56. package/dist/lib/messenger/whatsapp.js +103 -0
  57. package/dist/lib/messenger/whatsapp.js.map +1 -0
  58. package/dist/lib/rules.d.ts +17 -0
  59. package/dist/lib/rules.d.ts.map +1 -0
  60. package/dist/lib/rules.js +138 -0
  61. package/dist/lib/rules.js.map +1 -0
  62. package/dist/lib/rules.test.d.ts +2 -0
  63. package/dist/lib/rules.test.d.ts.map +1 -0
  64. package/dist/lib/rules.test.js +144 -0
  65. package/dist/lib/rules.test.js.map +1 -0
  66. package/dist/lib/setup-instructions.d.ts +3 -0
  67. package/dist/lib/setup-instructions.d.ts.map +1 -0
  68. package/dist/lib/setup-instructions.js +55 -0
  69. package/dist/lib/setup-instructions.js.map +1 -0
  70. package/dist/lib/slack.d.ts +18 -0
  71. package/dist/lib/slack.d.ts.map +1 -0
  72. package/dist/lib/slack.js +21 -0
  73. package/dist/lib/slack.js.map +1 -0
  74. package/dist/lib/supabase.d.ts +33 -0
  75. package/dist/lib/supabase.d.ts.map +1 -0
  76. package/dist/lib/supabase.js +169 -0
  77. package/dist/lib/supabase.js.map +1 -0
  78. package/package.json +67 -0
  79. package/supabase/functions/slack-callback/index.ts +198 -0
  80. package/supabase/functions/telegram-callback/index.ts +209 -0
  81. package/supabase/functions/whatsapp-callback/index.ts +180 -0
  82. package/supabase/migrations/001_create_approval_requests.sql +91 -0
package/README.md ADDED
@@ -0,0 +1,433 @@
1
+ # Claude Guard
2
+
3
+ Claude Code에서 위험한 명령어 실행 시 Slack, Telegram, WhatsApp으로 알림을 받고 승인/거부할 수 있는 원격 승인 시스템입니다.
4
+
5
+ ## 목차
6
+
7
+ - [Quick Start](#quick-start)
8
+ - [메신저별 설정 가이드](#메신저별-설정-가이드)
9
+ - [Slack 설정](#slack-설정)
10
+ - [Telegram 설정](#telegram-설정)
11
+ - [WhatsApp (Twilio) 설정](#whatsapp-twilio-설정)
12
+ - [Supabase 설정](#supabase-설정)
13
+ - [Edge Function 배포](#edge-function-배포)
14
+ - [설정 완료 및 테스트](#설정-완료-및-테스트)
15
+ - [사용법](#사용법)
16
+ - [설정 옵션](#설정-옵션)
17
+
18
+ ---
19
+
20
+ ## Quick Start
21
+
22
+ ```bash
23
+ # 1. 설치
24
+ npm install -g claude-remote-guard
25
+
26
+ # 2. 초기화 (대화형 설정)
27
+ guard init
28
+ ```
29
+
30
+ `guard init`을 실행하면 다음을 안내받습니다:
31
+ 1. 메신저 선택 (Slack / Telegram / WhatsApp)
32
+ 2. 선택한 메신저의 인증 정보 입력
33
+ 3. Supabase 연결 정보 입력
34
+ 4. SQL 스키마 및 Edge Function 생성
35
+
36
+ **중요**: 아래 가이드를 먼저 읽고 필요한 정보를 준비한 후 `guard init`을 실행하세요.
37
+
38
+ ---
39
+
40
+ ## 메신저별 설정 가이드
41
+
42
+ ### Slack 설정
43
+
44
+ #### 1단계: Slack 앱 생성
45
+
46
+ 1. [Slack API](https://api.slack.com/apps) 접속
47
+ 2. **Create New App** → **From scratch** 선택
48
+ 3. 앱 이름 입력 (예: `Claude Guard`), 워크스페이스 선택 후 **Create App**
49
+
50
+ #### 2단계: Incoming Webhook 활성화
51
+
52
+ 1. 왼쪽 메뉴에서 **Incoming Webhooks** 클릭
53
+ 2. **Activate Incoming Webhooks**를 **On**으로 전환
54
+ 3. 하단의 **Add New Webhook to Workspace** 클릭
55
+ 4. 알림 받을 채널 선택 후 **Allow**
56
+ 5. **Webhook URL** 복사 (예: `https://hooks.slack.com/services/T.../B.../xxx`)
57
+
58
+ ```
59
+ 📋 복사할 정보: Webhook URL
60
+ ```
61
+
62
+ #### 3단계: Interactivity 설정 (Edge Function 배포 후)
63
+
64
+ > ⚠️ 이 단계는 [Edge Function 배포](#edge-function-배포) 완료 후 진행합니다.
65
+
66
+ 1. Slack 앱 설정 페이지에서 **Interactivity & Shortcuts** 클릭
67
+ 2. **Interactivity**를 **On**으로 전환
68
+ 3. **Request URL**에 Edge Function URL 입력:
69
+ ```
70
+ https://<project-ref>.supabase.co/functions/v1/slack-callback
71
+ ```
72
+ 4. **Save Changes** 클릭
73
+
74
+ ---
75
+
76
+ ### Telegram 설정
77
+
78
+ #### 1단계: 봇 생성
79
+
80
+ 1. Telegram에서 [@BotFather](https://t.me/botfather) 검색하여 대화 시작
81
+ 2. `/newbot` 명령어 전송
82
+ 3. 봇 이름 입력 (예: `Claude Guard Bot`)
83
+ 4. 봇 username 입력 (예: `claude_guard_bot`) - 반드시 `_bot`으로 끝나야 함
84
+ 5. **Bot Token** 복사 (예: `123456789:ABCdefGHI...`)
85
+
86
+ ```
87
+ 📋 복사할 정보: Bot Token
88
+ ```
89
+
90
+ #### 2단계: Chat ID 확인
91
+
92
+ **방법 A: 봇과 대화 후 확인**
93
+ 1. 생성한 봇과 대화 시작 (`/start` 전송)
94
+ 2. 브라우저에서 다음 URL 접속:
95
+ ```
96
+ https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
97
+ ```
98
+ 3. 응답에서 `"chat":{"id":` 뒤의 숫자가 Chat ID
99
+
100
+ **방법 B: @userinfobot 사용**
101
+ 1. [@userinfobot](https://t.me/userinfobot)과 대화 시작
102
+ 2. 표시되는 `Id` 값이 Chat ID
103
+
104
+ ```
105
+ 📋 복사할 정보: Chat ID (숫자)
106
+ ```
107
+
108
+ #### 3단계: Webhook 설정 (Edge Function 배포 후)
109
+
110
+ > ⚠️ 이 단계는 [Edge Function 배포](#edge-function-배포) 완료 후 진행합니다.
111
+
112
+ 브라우저에서 다음 URL 접속 (한 번만 실행):
113
+
114
+ ```
115
+ https://api.telegram.org/bot<YOUR_BOT_TOKEN>/setWebhook?url=https://<project-ref>.supabase.co/functions/v1/telegram-callback
116
+ ```
117
+
118
+ 성공 시 응답:
119
+ ```json
120
+ {"ok":true,"result":true,"description":"Webhook was set"}
121
+ ```
122
+
123
+ ---
124
+
125
+ ### WhatsApp (Twilio) 설정
126
+
127
+ #### 1단계: Twilio 계정 생성
128
+
129
+ 1. [Twilio](https://www.twilio.com/try-twilio) 회원가입
130
+ 2. [Console](https://console.twilio.com/) 접속
131
+ 3. **Account SID**와 **Auth Token** 복사
132
+
133
+ ```
134
+ 📋 복사할 정보: Account SID, Auth Token
135
+ ```
136
+
137
+ #### 2단계: WhatsApp Sandbox 활성화
138
+
139
+ 1. Console에서 **Messaging** → **Try it out** → **Send a WhatsApp message** 이동
140
+ 2. 표시된 번호로 지정된 코드를 WhatsApp 메시지로 전송 (예: `join <sandbox-keyword>`)
141
+ 3. Sandbox 번호 확인 (예: `+1 415 523 8886`)
142
+
143
+ ```
144
+ 📋 복사할 정보: Twilio WhatsApp 번호, 내 전화번호
145
+ ```
146
+
147
+ #### 3단계: Webhook 설정 (Edge Function 배포 후)
148
+
149
+ > ⚠️ 이 단계는 [Edge Function 배포](#edge-function-배포) 완료 후 진행합니다.
150
+
151
+ 1. Twilio Console에서 **Messaging** → **Settings** → **WhatsApp Sandbox Settings** 이동
152
+ 2. **When a message comes in** URL 설정:
153
+ ```
154
+ https://<project-ref>.supabase.co/functions/v1/whatsapp-callback
155
+ ```
156
+ 3. Method: **POST** 선택
157
+ 4. **Save** 클릭
158
+
159
+ ---
160
+
161
+ ## Supabase 설정
162
+
163
+ #### 1단계: 프로젝트 생성
164
+
165
+ 1. [Supabase Dashboard](https://supabase.com/dashboard) 접속
166
+ 2. **New Project** 클릭
167
+ 3. 프로젝트 이름, 데이터베이스 비밀번호 설정 후 생성
168
+
169
+ #### 2단계: API 정보 확인
170
+
171
+ 1. 프로젝트 선택 후 **Settings** → **API** 이동
172
+ 2. 다음 정보 복사:
173
+ - **Project URL**: `https://xxxx.supabase.co`
174
+ - **anon public** 키: `eyJhbGciOiJIUzI1NiIs...`
175
+
176
+ ```
177
+ 📋 복사할 정보: Project URL, anon public 키
178
+ ```
179
+
180
+ #### 3단계: SQL 스키마 실행
181
+
182
+ `guard init` 실행 후 출력된 SQL을 복사하여:
183
+
184
+ 1. Supabase Dashboard에서 **SQL Editor** 클릭
185
+ 2. **New Query** 클릭
186
+ 3. SQL 붙여넣기 후 **Run** 클릭
187
+
188
+ 또는 직접 실행:
189
+
190
+ ```sql
191
+ -- approval_requests 테이블 생성
192
+ CREATE TABLE IF NOT EXISTS approval_requests (
193
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
194
+ request_id TEXT UNIQUE NOT NULL,
195
+ command TEXT NOT NULL,
196
+ reason TEXT NOT NULL,
197
+ severity TEXT NOT NULL,
198
+ cwd TEXT NOT NULL,
199
+ status TEXT DEFAULT 'pending' NOT NULL,
200
+ created_at TIMESTAMPTZ DEFAULT now() NOT NULL,
201
+ updated_at TIMESTAMPTZ DEFAULT now() NOT NULL
202
+ );
203
+
204
+ -- 인덱스 생성
205
+ CREATE INDEX IF NOT EXISTS idx_approval_requests_request_id ON approval_requests(request_id);
206
+ CREATE INDEX IF NOT EXISTS idx_approval_requests_status ON approval_requests(status);
207
+
208
+ -- RLS 활성화
209
+ ALTER TABLE approval_requests ENABLE ROW LEVEL SECURITY;
210
+
211
+ -- RLS 정책
212
+ CREATE POLICY "Allow anonymous read" ON approval_requests FOR SELECT USING (true);
213
+ CREATE POLICY "Allow anonymous insert" ON approval_requests FOR INSERT WITH CHECK (true);
214
+ CREATE POLICY "Allow anonymous update" ON approval_requests FOR UPDATE USING (true);
215
+
216
+ -- Realtime 활성화
217
+ ALTER PUBLICATION supabase_realtime ADD TABLE approval_requests;
218
+ ```
219
+
220
+ ---
221
+
222
+ ## Edge Function 배포
223
+
224
+ #### 1단계: Supabase CLI 설치
225
+
226
+ ```bash
227
+ npm install -g supabase
228
+ ```
229
+
230
+ #### 2단계: 로그인 및 프로젝트 연결
231
+
232
+ ```bash
233
+ # Supabase 로그인
234
+ supabase login
235
+
236
+ # 프로젝트 연결 (project-ref는 URL에서 확인: https://[project-ref].supabase.co)
237
+ supabase link --project-ref <your-project-ref>
238
+ ```
239
+
240
+ #### 3단계: Edge Function 배포
241
+
242
+ `guard init` 실행 시 `~/.claude-guard/supabase/functions/` 디렉토리에 Edge Function이 생성됩니다.
243
+
244
+ ```bash
245
+ # Slack 사용 시
246
+ supabase functions deploy slack-callback --project-ref <your-project-ref>
247
+
248
+ # Telegram 사용 시
249
+ supabase functions deploy telegram-callback --project-ref <your-project-ref>
250
+
251
+ # WhatsApp 사용 시
252
+ supabase functions deploy whatsapp-callback --project-ref <your-project-ref>
253
+ ```
254
+
255
+ 배포 완료 후 Edge Function URL:
256
+ ```
257
+ https://<project-ref>.supabase.co/functions/v1/<function-name>
258
+ ```
259
+
260
+ > ⚠️ 배포 완료 후 위의 메신저별 Webhook 설정 단계로 돌아가 URL을 등록하세요.
261
+
262
+ ---
263
+
264
+ ## 설정 완료 및 테스트
265
+
266
+ #### 연결 상태 확인
267
+
268
+ ```bash
269
+ guard status
270
+ ```
271
+
272
+ 출력 예시:
273
+ ```
274
+ Claude Guard Status
275
+ ───────────────────
276
+ Messenger: telegram ✓
277
+ Supabase: connected ✓
278
+ Hook: installed ✓
279
+ ```
280
+
281
+ #### 테스트 알림 전송
282
+
283
+ ```bash
284
+ guard test
285
+ ```
286
+
287
+ 선택한 메신저로 테스트 알림이 전송됩니다. 버튼(Slack/Telegram) 또는 답장(WhatsApp)으로 승인/거부를 테스트하세요.
288
+
289
+ ---
290
+
291
+ ## 사용법
292
+
293
+ 설정 완료 후 Claude Code를 평소처럼 사용하면 됩니다. 위험한 명령어 실행 시 자동으로 알림이 전송됩니다.
294
+
295
+ ### 명령어 목록
296
+
297
+ | 명령어 | 설명 |
298
+ |--------|------|
299
+ | `guard init` | 초기 설정 (대화형) |
300
+ | `guard status` | 연결 상태 확인 |
301
+ | `guard test` | 테스트 알림 전송 |
302
+ | `guard uninstall` | Claude Guard 제거 |
303
+
304
+ ### 동작 방식
305
+
306
+ ```
307
+ Claude Code ──▶ Hook ──▶ 메신저 알림
308
+ │ │
309
+ │ (대기) │ 승인/거부
310
+ │ ▼
311
+ │◀── Supabase ◀── Edge Function
312
+
313
+
314
+ 명령어 실행 또는 차단
315
+ ```
316
+
317
+ 1. Claude Code가 위험한 명령어를 실행하려 할 때 Hook이 가로챔
318
+ 2. Supabase에 승인 요청 저장 & 메신저로 알림 전송
319
+ 3. 사용자가 승인 또는 거부
320
+ 4. Edge Function이 Supabase 상태 업데이트
321
+ 5. Hook이 Realtime 구독으로 결과 수신
322
+ 6. 명령어 실행 허용 또는 차단
323
+
324
+ ---
325
+
326
+ ## 설정 옵션
327
+
328
+ 설정 파일 위치: `~/.claude-guard/config.json`
329
+
330
+ ```json
331
+ {
332
+ "messenger": {
333
+ "type": "slack",
334
+ "slack": {
335
+ "webhookUrl": "https://hooks.slack.com/services/..."
336
+ }
337
+ },
338
+ "supabase": {
339
+ "url": "https://xxxx.supabase.co",
340
+ "anonKey": "eyJhbGciOiJIUzI1NiIs..."
341
+ },
342
+ "rules": {
343
+ "timeoutSeconds": 300,
344
+ "defaultAction": "deny",
345
+ "customPatterns": [],
346
+ "whitelist": []
347
+ }
348
+ }
349
+ ```
350
+
351
+ ### 옵션 설명
352
+
353
+ | 옵션 | 기본값 | 설명 |
354
+ |------|--------|------|
355
+ | `timeoutSeconds` | 300 | 승인 대기 시간 (초) |
356
+ | `defaultAction` | `"deny"` | 타임아웃 시 동작 (`allow` 또는 `deny`) |
357
+ | `customPatterns` | `[]` | 추가 위험 패턴 |
358
+ | `whitelist` | `[]` | 항상 허용할 명령어 패턴 (정규식) |
359
+
360
+ ### 커스텀 패턴 예시
361
+
362
+ ```json
363
+ {
364
+ "rules": {
365
+ "customPatterns": [
366
+ {
367
+ "pattern": "deploy-prod",
368
+ "severity": "critical",
369
+ "reason": "프로덕션 배포 명령"
370
+ }
371
+ ]
372
+ }
373
+ }
374
+ ```
375
+
376
+ ### 기본 위험 패턴
377
+
378
+ | 패턴 | 심각도 | 이유 |
379
+ |------|--------|------|
380
+ | `rm -rf` | high | 재귀적 강제 삭제 |
381
+ | `git push --force` | critical | 원격 히스토리 덮어쓰기 |
382
+ | `git reset --hard` | high | 커밋되지 않은 변경사항 삭제 |
383
+ | `npm publish` | high | npm 패키지 배포 |
384
+ | `sudo` | high | 관리자 권한 실행 |
385
+ | `curl \| bash` | critical | 원격 스크립트 실행 |
386
+
387
+ ---
388
+
389
+ ## 문제 해결
390
+
391
+ ### Slack 버튼이 동작하지 않음
392
+
393
+ - Interactivity가 활성화되어 있는지 확인
394
+ - Request URL이 정확한지 확인
395
+ - Edge Function 로그 확인: `supabase functions logs slack-callback`
396
+
397
+ ### Telegram 버튼이 동작하지 않음
398
+
399
+ - Webhook이 설정되어 있는지 확인:
400
+ ```
401
+ https://api.telegram.org/bot<TOKEN>/getWebhookInfo
402
+ ```
403
+ - Edge Function 로그 확인: `supabase functions logs telegram-callback`
404
+
405
+ ### WhatsApp 답장이 인식되지 않음
406
+
407
+ - Sandbox 번호로 메시지를 보내고 있는지 확인
408
+ - 답장 형식 확인: `APPROVE <request-id>` 또는 `REJECT <request-id>`
409
+ - Twilio Webhook URL이 정확한지 확인
410
+
411
+ ### 일반적인 문제
412
+
413
+ ```bash
414
+ # 설정 상태 확인
415
+ guard status
416
+
417
+ # Edge Function 로그 확인
418
+ supabase functions logs <function-name> --project-ref <project-ref>
419
+ ```
420
+
421
+ ---
422
+
423
+ ## 요구사항
424
+
425
+ - Node.js 18 이상
426
+ - Supabase 계정 (무료 플랜 가능)
427
+ - Slack / Telegram / Twilio 계정 (선택)
428
+
429
+ ---
430
+
431
+ ## License
432
+
433
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":""}