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.
- package/README.md +433 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +427 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/hook.d.ts +3 -0
- package/dist/bin/hook.d.ts.map +1 -0
- package/dist/bin/hook.js +136 -0
- package/dist/bin/hook.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/claude-settings.d.ts +11 -0
- package/dist/lib/claude-settings.d.ts.map +1 -0
- package/dist/lib/claude-settings.js +96 -0
- package/dist/lib/claude-settings.js.map +1 -0
- package/dist/lib/config.d.ts +47 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +177 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/edge-function.d.ts +14 -0
- package/dist/lib/edge-function.d.ts.map +1 -0
- package/dist/lib/edge-function.js +521 -0
- package/dist/lib/edge-function.js.map +1 -0
- package/dist/lib/firebase.d.ts +27 -0
- package/dist/lib/firebase.d.ts.map +1 -0
- package/dist/lib/firebase.js +136 -0
- package/dist/lib/firebase.js.map +1 -0
- package/dist/lib/messenger/base.d.ts +6 -0
- package/dist/lib/messenger/base.d.ts.map +1 -0
- package/dist/lib/messenger/base.js +34 -0
- package/dist/lib/messenger/base.js.map +1 -0
- package/dist/lib/messenger/factory.d.ts +15 -0
- package/dist/lib/messenger/factory.d.ts.map +1 -0
- package/dist/lib/messenger/factory.js +37 -0
- package/dist/lib/messenger/factory.js.map +1 -0
- package/dist/lib/messenger/index.d.ts +7 -0
- package/dist/lib/messenger/index.d.ts.map +1 -0
- package/dist/lib/messenger/index.js +9 -0
- package/dist/lib/messenger/index.js.map +1 -0
- package/dist/lib/messenger/slack.d.ts +14 -0
- package/dist/lib/messenger/slack.d.ts.map +1 -0
- package/dist/lib/messenger/slack.js +169 -0
- package/dist/lib/messenger/slack.js.map +1 -0
- package/dist/lib/messenger/telegram.d.ts +15 -0
- package/dist/lib/messenger/telegram.d.ts.map +1 -0
- package/dist/lib/messenger/telegram.js +120 -0
- package/dist/lib/messenger/telegram.js.map +1 -0
- package/dist/lib/messenger/types.d.ts +21 -0
- package/dist/lib/messenger/types.d.ts.map +1 -0
- package/dist/lib/messenger/types.js +2 -0
- package/dist/lib/messenger/types.js.map +1 -0
- package/dist/lib/messenger/whatsapp.d.ts +16 -0
- package/dist/lib/messenger/whatsapp.d.ts.map +1 -0
- package/dist/lib/messenger/whatsapp.js +103 -0
- package/dist/lib/messenger/whatsapp.js.map +1 -0
- package/dist/lib/rules.d.ts +17 -0
- package/dist/lib/rules.d.ts.map +1 -0
- package/dist/lib/rules.js +138 -0
- package/dist/lib/rules.js.map +1 -0
- package/dist/lib/rules.test.d.ts +2 -0
- package/dist/lib/rules.test.d.ts.map +1 -0
- package/dist/lib/rules.test.js +144 -0
- package/dist/lib/rules.test.js.map +1 -0
- package/dist/lib/setup-instructions.d.ts +3 -0
- package/dist/lib/setup-instructions.d.ts.map +1 -0
- package/dist/lib/setup-instructions.js +55 -0
- package/dist/lib/setup-instructions.js.map +1 -0
- package/dist/lib/slack.d.ts +18 -0
- package/dist/lib/slack.d.ts.map +1 -0
- package/dist/lib/slack.js +21 -0
- package/dist/lib/slack.js.map +1 -0
- package/dist/lib/supabase.d.ts +33 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +169 -0
- package/dist/lib/supabase.js.map +1 -0
- package/package.json +67 -0
- package/supabase/functions/slack-callback/index.ts +198 -0
- package/supabase/functions/telegram-callback/index.ts +209 -0
- package/supabase/functions/whatsapp-callback/index.ts +180 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":""}
|