cc-sandboxer 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/LICENSE +21 -0
- package/README.md +515 -0
- package/README.vi.md +509 -0
- package/README.zh.md +508 -0
- package/cc-sandboxer.sh +682 -0
- package/docker/Dockerfile +65 -0
- package/docker/init-firewall.sh +126 -0
- package/package.json +46 -0
- package/vscode/tasks.json +61 -0
package/README.vi.md
ADDED
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
# Claude Code Sandbox
|
|
2
|
+
|
|
3
|
+
[English](README.md) | **Tiếng Việt** | [中文](README.zh.md)
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
██████╗██╗ █████╗ ██╗ ██╗██████╗ ███████╗
|
|
7
|
+
██╔════╝██║ ██╔══██╗██║ ██║██╔══██╗██╔════╝
|
|
8
|
+
██║ ██║ ███████║██║ ██║██║ ██║█████╗
|
|
9
|
+
██║ ██║ ██╔══██║██║ ██║██║ ██║██╔══╝
|
|
10
|
+
╚██████╗███████╗██║ ██║╚██████╔╝██████╔╝███████╗
|
|
11
|
+
╚═════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝
|
|
12
|
+
C O D E S A N D B O X
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Chạy `claude --dangerously-skip-permissions` an toàn trong Docker sandbox.**
|
|
16
|
+
|
|
17
|
+
Một lệnh duy nhất. Cách ly hoàn toàn. Terminal hoặc VS Code.
|
|
18
|
+
|
|
19
|
+
[![Docker][docker-badge]][docker-url]
|
|
20
|
+
[![OrbStack][orbstack-badge]][orbstack-url]
|
|
21
|
+
[![VS Code][vscode-badge]][vscode-url]
|
|
22
|
+
[![License: MIT][license-badge]][license-url]
|
|
23
|
+
|
|
24
|
+
[docker-badge]: https://img.shields.io/badge/Docker-Ready-2496ED?style=for-the-badge&logo=docker&logoColor=white
|
|
25
|
+
[docker-url]: https://www.docker.com/
|
|
26
|
+
[orbstack-badge]: https://img.shields.io/badge/OrbStack-Compatible-000000?style=for-the-badge
|
|
27
|
+
[orbstack-url]: https://orbstack.dev/
|
|
28
|
+
[vscode-badge]: https://img.shields.io/badge/VS_Code-DevContainer-007ACC?style=for-the-badge&logo=visual-studio-code&logoColor=white
|
|
29
|
+
[vscode-url]: https://code.visualstudio.com/
|
|
30
|
+
[license-badge]: https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge
|
|
31
|
+
[license-url]: LICENSE
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Bắt đầu nhanh
|
|
36
|
+
|
|
37
|
+
### Qua npx (khuyên dùng)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Chạy trong thư mục hiện tại
|
|
41
|
+
npx cc-sandboxer
|
|
42
|
+
|
|
43
|
+
# Chạy với dự án cụ thể
|
|
44
|
+
npx cc-sandboxer ~/projects/my-app
|
|
45
|
+
|
|
46
|
+
# Chạy một lệnh duy nhất
|
|
47
|
+
npx cc-sandboxer . -p "Sửa tất cả lỗi lint"
|
|
48
|
+
|
|
49
|
+
# Thiết lập VS Code DevContainer
|
|
50
|
+
npx cc-sandboxer --init ~/projects/my-app
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Qua git clone
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
git clone https://github.com/ngocquang/cc-sandbox.git
|
|
57
|
+
cd cc-sandbox
|
|
58
|
+
chmod +x cc-sandboxer.sh
|
|
59
|
+
./cc-sandboxer.sh
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### VS Code (DevContainer)
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Thiết lập DevContainer trong dự án
|
|
66
|
+
npx cc-sandboxer --init ~/projects/my-app
|
|
67
|
+
|
|
68
|
+
# Mở VS Code -> Reopen in Container -> Chạy task
|
|
69
|
+
code ~/projects/my-app
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
> Lần chạy đầu tiên sẽ build Docker image (~2-3 phút). Sau đó, khởi động chỉ mất vài giây.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Tại sao cần Sandbox?
|
|
77
|
+
|
|
78
|
+
[Claude Code](https://docs.anthropic.com/en/docs/claude-code) với `--dangerously-skip-permissions` rất hiệu quả — Claude có thể thực thi **bất kỳ** lệnh nào mà không cần xác nhận. Nhưng chạy trực tiếp trên máy thật rất rủi ro:
|
|
79
|
+
|
|
80
|
+
| | Không có Sandbox | Có Sandbox |
|
|
81
|
+
| ------------ | ---------------------------- | ------------------------------- |
|
|
82
|
+
| Hệ thống tệp| Toàn quyền truy cập máy | Chỉ `/workspace` |
|
|
83
|
+
| Mạng | Internet không giới hạn | Chỉ domain trong whitelist |
|
|
84
|
+
| TCP đi ra | Mở tất cả cổng | Chặn TCP không trong whitelist |
|
|
85
|
+
| Trường hợp xấu nhất | `rm -rf /` phá hủy hệ thống | Container chết, máy host vẫn ổn |
|
|
86
|
+
| Overhead | Không | ~3 giây |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Cài đặt
|
|
91
|
+
|
|
92
|
+
### Cách A — npx (không cần cài)
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npx cc-sandboxer
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Cách B — Cài toàn cục
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
npm install -g cc-sandboxer
|
|
102
|
+
cc-sandboxer
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Cách C — Clone repo
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
git clone https://github.com/ngocquang/cc-sandbox.git
|
|
109
|
+
cd cc-sandbox
|
|
110
|
+
chmod +x cc-sandboxer.sh
|
|
111
|
+
./cc-sandboxer.sh
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Alias cho Shell (tùy chọn)
|
|
115
|
+
|
|
116
|
+
Thêm vào `~/.zshrc` hoặc `~/.bashrc` để truy cập nhanh:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
alias cc="npx cc-sandboxer"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Sau đó tải lại shell:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
source ~/.zshrc
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Bây giờ bạn có thể dùng:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
cc # thư mục hiện tại
|
|
132
|
+
cc ~/projects/my-app # dự án cụ thể
|
|
133
|
+
cc . -p "Sửa tất cả lỗi lint"
|
|
134
|
+
cc . --continue
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Yêu cầu hệ thống
|
|
138
|
+
|
|
139
|
+
Bạn cần **một** trong các container runtime sau:
|
|
140
|
+
|
|
141
|
+
> **Lưu ý:** Chỉ hỗ trợ **macOS** và **Linux**. Không hỗ trợ Windows.
|
|
142
|
+
|
|
143
|
+
| Runtime | Nền tảng | Cài đặt |
|
|
144
|
+
| -------------- | -------------- | ------------------------------------------------------------- |
|
|
145
|
+
| Docker Desktop | macOS / Linux | [docker.com](https://www.docker.com/products/docker-desktop/) |
|
|
146
|
+
| OrbStack | macOS | [orbstack.dev](https://orbstack.dev/) |
|
|
147
|
+
| Colima | macOS / Linux | [github](https://github.com/abiosoft/colima) |
|
|
148
|
+
| Docker Engine | Linux | [docs.docker.com](https://docs.docker.com/engine/install/) |
|
|
149
|
+
|
|
150
|
+
Với chế độ VS Code, cần cài thêm extension [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers).
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Chế độ Terminal
|
|
155
|
+
|
|
156
|
+
### Tương tác (khuyên dùng)
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
cc-sandboxer # thư mục hiện tại
|
|
160
|
+
cc-sandboxer ~/projects/my-app # dự án cụ thể
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Chạy lệnh một lần
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
cc-sandboxer . -p "Tái cấu trúc module auth và viết test"
|
|
167
|
+
cc-sandboxer . -p "Sửa tất cả lỗi ESLint và thêm type còn thiếu"
|
|
168
|
+
cc-sandboxer . -p "Đọc SPEC.md -> viết test fail -> implement -> lặp lại"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Tiếp tục cuộc hội thoại trước
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
cc-sandboxer . --continue
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Chặn lệnh nguy hiểm
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
cc-sandboxer . --disallowedTools "Bash(rm:*)"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Chế độ shell
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
cc-sandboxer --shell
|
|
187
|
+
# Sau đó chạy thủ công bên trong:
|
|
188
|
+
# claude --dangerously-skip-permissions
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
> Tất cả lệnh hoạt động với `npx cc-sandboxer`, `cc-sandboxer` (cài toàn cục), hoặc `./cc-sandboxer.sh` (clone repo).
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Chế độ VS Code
|
|
196
|
+
|
|
197
|
+
Flag `--init` thiết lập môi trường DevContainer đầy đủ trong dự án — không cần cấu hình thủ công.
|
|
198
|
+
|
|
199
|
+
### Thiết lập
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
./cc-sandboxer.sh --init ~/projects/my-app
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Lệnh này tạo ra:
|
|
206
|
+
|
|
207
|
+
```text
|
|
208
|
+
your-project/
|
|
209
|
+
├── devcontainer/
|
|
210
|
+
│ ├── Dockerfile # Image sandbox với đầy đủ công cụ
|
|
211
|
+
│ ├── devcontainer.json # Cấu hình container cho VS Code
|
|
212
|
+
│ └── init-firewall.sh # Quy tắc bảo mật mạng
|
|
213
|
+
└── .vscode/
|
|
214
|
+
└── tasks.json # Task Claude được cấu hình sẵn
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Khuyên dùng: Cài Extension Claude Code
|
|
218
|
+
|
|
219
|
+
Để có trải nghiệm tốt nhất trong DevContainer, hãy cài [extension Claude Code](https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code) trong VS Code **trước khi** mở container. DevContainer đã được cấu hình sẵn để tự động cài extension bên trong container, nhưng cài trên máy host giúp thiết lập mượt mà hơn.
|
|
220
|
+
|
|
221
|
+
> **Mẹo:** Extension cung cấp giao diện VS Code tích hợp cho Claude Code — bảng chat, gợi ý inline và quản lý task — tất cả đều trong sandbox.
|
|
222
|
+
|
|
223
|
+
### Mở trong VS Code
|
|
224
|
+
|
|
225
|
+
```text
|
|
226
|
+
1. code ~/projects/my-app
|
|
227
|
+
2. Cmd+Shift+P -> "Dev Containers: Reopen in Container"
|
|
228
|
+
3. Đợi build (chỉ lần đầu)
|
|
229
|
+
4. Extension Claude Code tự động cài trong container.
|
|
230
|
+
5. Xong! Bạn đã ở trong sandbox.
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Task trong VS Code
|
|
234
|
+
|
|
235
|
+
Khi đã ở trong container, dùng `Cmd+Shift+P` -> `Tasks: Run Task`:
|
|
236
|
+
|
|
237
|
+
| Task | Mô tả |
|
|
238
|
+
| ------------------------- | --------------------------------- |
|
|
239
|
+
| Claude: Skip Permissions | Chế độ tương tác |
|
|
240
|
+
| Claude: Resume Last Chat | Tiếp tục cuộc hội thoại trước |
|
|
241
|
+
| Claude: One-Shot Task | Nhập mô tả task cần thực hiện |
|
|
242
|
+
| Claude: Safe Mode (no rm) | Bỏ qua quyền nhưng chặn `rm` |
|
|
243
|
+
| Firewall: Re-initialize | Áp dụng lại quy tắc mạng |
|
|
244
|
+
| Claude: Login | Xác thực lần đầu |
|
|
245
|
+
|
|
246
|
+
### Xác thực lần đầu
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
# Chạy task login, hoặc trong terminal:
|
|
250
|
+
claude login
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Token xác thực được lưu trong Docker volume — bạn chỉ cần làm một lần.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Bảo mật
|
|
258
|
+
|
|
259
|
+
### Tường lửa mạng
|
|
260
|
+
|
|
261
|
+
Container chạy tường lửa `iptables` với **chặn mặc định tất cả TCP đi ra**. Chỉ các domain trong whitelist được phép:
|
|
262
|
+
|
|
263
|
+
| Dịch vụ | Domain |
|
|
264
|
+
| -------------- | ------------------------------------------------------------------ |
|
|
265
|
+
| Claude API | `api.anthropic.com`, `auth.anthropic.com`, `statsig.anthropic.com`, `sentry.io`, `anthropic.gallerycdn.azure.cn` |
|
|
266
|
+
| Claude Code | `storage.googleapis.com` |
|
|
267
|
+
| npm | `registry.npmjs.org`, `registry.yarnpkg.com` |
|
|
268
|
+
| GitHub | `github.com`, `api.github.com`, `*.githubusercontent.com` |
|
|
269
|
+
| PyPI | `pypi.org`, `files.pythonhosted.org` |
|
|
270
|
+
| Microsoft | `microsoft.com` |
|
|
271
|
+
| VS Code | `marketplace.visualstudio.com`, `open-vsx.org`, `*.vo.msecnd.net`, `gallerycdn.vsassets.io` |
|
|
272
|
+
|
|
273
|
+
**Mọi thứ khác đều bị chặn.** Claude không thể rò rỉ code hoặc tải từ nguồn không tin cậy.
|
|
274
|
+
|
|
275
|
+
Tính năng bảo mật chính:
|
|
276
|
+
|
|
277
|
+
- **Chặn tất cả TCP đi ra** mặc định (không chỉ port 80/443)
|
|
278
|
+
- **Giảm thiểu DNS tunneling** — truy vấn DNS chỉ giới hạn ở resolver cục bộ
|
|
279
|
+
- **Xác thực đầu vào** — tên domain được kiểm tra trước khi thêm vào whitelist
|
|
280
|
+
- **Không dùng seccomp=unconfined** — chỉ cấp capability `NET_ADMIN` cho iptables
|
|
281
|
+
|
|
282
|
+
#### Thêm domain tùy chỉnh
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
# Chế độ CLI
|
|
286
|
+
./cc-sandboxer.sh --allow-domain "api.example.com" --allow-domain "docker.io"
|
|
287
|
+
|
|
288
|
+
# Chế độ DevContainer — sửa devcontainer/init-firewall.sh
|
|
289
|
+
# Hoặc đặt biến môi trường trong devcontainer.json:
|
|
290
|
+
# "containerEnv": { "EXTRA_ALLOWED_DOMAINS": "api.example.com,docker.io" }
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Cách ly hệ thống tệp
|
|
294
|
+
|
|
295
|
+
| Mục | Quyền truy cập |
|
|
296
|
+
| --------------- | ------------------------- |
|
|
297
|
+
| Dự án của bạn | Mount tại `/workspace` |
|
|
298
|
+
| Hệ thống host | Cách ly |
|
|
299
|
+
| `.gitconfig` | Chỉ đọc |
|
|
300
|
+
| Token xác thực | Docker volume (lưu trữ) |
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Cấu hình
|
|
305
|
+
|
|
306
|
+
### Biến môi trường
|
|
307
|
+
|
|
308
|
+
| Biến | Mặc định | Mô tả |
|
|
309
|
+
| ----------------------- | ------------------- | --------------------------------------------------- |
|
|
310
|
+
| `TZ` | `Asia/Ho_Chi_Minh` | Múi giờ container |
|
|
311
|
+
| `EXTRA_ALLOWED_DOMAINS` | _(trống)_ | Domain cách nhau bởi dấu phẩy cho tường lửa (DevContainer) |
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
TZ=America/New_York ./cc-sandboxer.sh
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Tùy chỉnh DevContainer
|
|
318
|
+
|
|
319
|
+
Sau khi chạy `--init`, bạn có thể sửa bất kỳ file nào trong `devcontainer/`:
|
|
320
|
+
|
|
321
|
+
**Thêm công cụ** — sửa `devcontainer/Dockerfile`:
|
|
322
|
+
|
|
323
|
+
```dockerfile
|
|
324
|
+
# Thêm công cụ Python ML
|
|
325
|
+
RUN pip3 install --break-system-packages numpy pandas
|
|
326
|
+
|
|
327
|
+
# Thêm Go
|
|
328
|
+
RUN curl -OL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz && \
|
|
329
|
+
tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
|
|
330
|
+
ENV PATH=$PATH:/usr/local/go/bin
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**Thêm extension VS Code** — sửa `devcontainer/devcontainer.json`:
|
|
334
|
+
|
|
335
|
+
```jsonc
|
|
336
|
+
"customizations": {
|
|
337
|
+
"vscode": {
|
|
338
|
+
"extensions": [
|
|
339
|
+
"anthropic.claude-code",
|
|
340
|
+
"dbaeumer.vscode-eslint",
|
|
341
|
+
"esbenp.prettier-vscode"
|
|
342
|
+
]
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
Sau đó rebuild: `Cmd+Shift+P` -> `Dev Containers: Rebuild Container`
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## Có gì trong hộp?
|
|
352
|
+
|
|
353
|
+
| Danh mục | Công cụ |
|
|
354
|
+
| ------------ | ------------------------------- |
|
|
355
|
+
| **Runtime** | Node.js 20, Python 3, npm, pip |
|
|
356
|
+
| **Editor** | nano, vim |
|
|
357
|
+
| **Tìm kiếm**| ripgrep (`rg`), fd-find |
|
|
358
|
+
| **VCS** | git, gh (GitHub CLI), git-delta |
|
|
359
|
+
| **Shell** | zsh, Oh My Zsh, fzf |
|
|
360
|
+
| **Mạng** | curl, wget, jq |
|
|
361
|
+
| **Bảo mật** | iptables, ipset, dnsutils |
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## Tất cả tùy chọn CLI
|
|
366
|
+
|
|
367
|
+
```text
|
|
368
|
+
Cách dùng: cc-sandboxer [project_path] [options]
|
|
369
|
+
|
|
370
|
+
Tham số:
|
|
371
|
+
project_path Đường dẫn đến dự án (mặc định: thư mục hiện tại)
|
|
372
|
+
|
|
373
|
+
Thiết lập:
|
|
374
|
+
--init Tạo devcontainer + VS Code tasks trong dự án
|
|
375
|
+
--rebuild Buộc build lại Docker image
|
|
376
|
+
--version, -v Hiển thị phiên bản
|
|
377
|
+
--help, -h Hiển thị trợ giúp
|
|
378
|
+
|
|
379
|
+
Runtime:
|
|
380
|
+
--shell Mở shell mà không khởi động Claude
|
|
381
|
+
--no-firewall Bỏ qua tường lửa mạng
|
|
382
|
+
--allow-domain NAME Thêm domain vào whitelist (có thể lặp lại)
|
|
383
|
+
--continue, -c Tiếp tục cuộc hội thoại trước
|
|
384
|
+
-p "prompt" Chế độ chạy lệnh một lần
|
|
385
|
+
--disallowedTools TOOLS Chặn các tool cụ thể của Claude
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## Dọn dẹp
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
# Xóa dữ liệu lưu trữ
|
|
394
|
+
docker volume rm claude-config claude-npm claude-history
|
|
395
|
+
|
|
396
|
+
# Xóa image
|
|
397
|
+
docker rmi cc-sandboxer:latest
|
|
398
|
+
|
|
399
|
+
# Xóa volume DevContainer
|
|
400
|
+
docker volume rm claude-code-config claude-code-npm claude-code-history
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## Xử lý sự cố
|
|
406
|
+
|
|
407
|
+
### "Firewall skipped"
|
|
408
|
+
|
|
409
|
+
Container cần capability `NET_ADMIN`.
|
|
410
|
+
Trong chế độ CLI, điều này được thiết lập tự động.
|
|
411
|
+
Trong chế độ DevContainer, kiểm tra `devcontainer.json` có:
|
|
412
|
+
|
|
413
|
+
```json
|
|
414
|
+
"runArgs": ["--cap-add=NET_ADMIN"]
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Claude chưa xác thực
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
# Chế độ CLI
|
|
421
|
+
./cc-sandboxer.sh --shell
|
|
422
|
+
claude login
|
|
423
|
+
|
|
424
|
+
# Chế độ VS Code
|
|
425
|
+
# Cmd+Shift+P -> Tasks: Run Task -> Claude: Login
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### Lần build đầu chậm
|
|
429
|
+
|
|
430
|
+
Lần build đầu tải Node.js, system packages và Claude Code (~2-3 phút).
|
|
431
|
+
Các lần chạy sau dùng image đã cache.
|
|
432
|
+
Buộc build lại để cập nhật Claude Code:
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
./cc-sandboxer.sh --rebuild
|
|
436
|
+
# hoặc trong VS Code:
|
|
437
|
+
# Cmd+Shift+P -> Dev Containers: Rebuild Container
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### Cần domain bị chặn
|
|
441
|
+
|
|
442
|
+
```bash
|
|
443
|
+
# CLI
|
|
444
|
+
./cc-sandboxer.sh --allow-domain "your-domain.com"
|
|
445
|
+
|
|
446
|
+
# DevContainer
|
|
447
|
+
# thêm vào mảng ALLOWED_DOMAINS trong init-firewall.sh
|
|
448
|
+
# hoặc đặt biến môi trường:
|
|
449
|
+
# EXTRA_ALLOWED_DOMAINS="domain1.com,domain2.com"
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Extension VS Code không hoạt động trong container
|
|
453
|
+
|
|
454
|
+
Mở bảng Extensions, tìm extension,
|
|
455
|
+
sau đó nhấn "Install in Container".
|
|
456
|
+
Một số extension cần được cài thủ công
|
|
457
|
+
bên trong DevContainer.
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## Kiểm thử
|
|
462
|
+
|
|
463
|
+
Unit test dùng [bats-core](https://github.com/bats-core/bats-core) (Bash Automated Testing System).
|
|
464
|
+
|
|
465
|
+
### Cài đặt & Chạy
|
|
466
|
+
|
|
467
|
+
```bash
|
|
468
|
+
# Cài bats (macOS)
|
|
469
|
+
brew install bats-core
|
|
470
|
+
|
|
471
|
+
# Chạy tất cả test
|
|
472
|
+
bats tests/
|
|
473
|
+
|
|
474
|
+
# Chạy file test cụ thể
|
|
475
|
+
bats tests/cc-sandbox.bats
|
|
476
|
+
bats tests/init-firewall.bats
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Phạm vi kiểm thử
|
|
480
|
+
|
|
481
|
+
| Lĩnh vực | Số test | Nội dung kiểm tra |
|
|
482
|
+
| --- | --- | --- |
|
|
483
|
+
| CLI flags | 5 | `--version`, `-v`, `--help`, `-h`, tất cả tùy chọn |
|
|
484
|
+
| Xác thực domain | 5 | Thiếu tham số, xung đột flag, ký tự đặc biệt, khoảng trắng, dấu gạch |
|
|
485
|
+
| Chế độ `--init` | 10 | Tạo file, không ghi đè, xác thực nội dung, đồng bộ nguồn |
|
|
486
|
+
| Sinh firewall | 7 | Domain mặc định/thêm, quy tắc iptables, DNS tunneling, SSH, cú pháp |
|
|
487
|
+
| Script firewall | 19 | Cú pháp, domain, quy tắc bảo mật, thứ tự ipset, xác thực regex |
|
|
488
|
+
| Hiển thị | 3 | Banner, chuỗi phiên bản, ASCII art |
|
|
489
|
+
| **Tổng** | **49** | |
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
## Đóng góp
|
|
494
|
+
|
|
495
|
+
PR luôn được chào đón! Một số ý tưởng:
|
|
496
|
+
|
|
497
|
+
- [ ] Hỗ trợ Cursor IDE
|
|
498
|
+
- [ ] Hỗ trợ Windsurf
|
|
499
|
+
- [ ] Cấu hình firewall theo dự án
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## Giấy phép
|
|
504
|
+
|
|
505
|
+
MIT — xem [LICENSE](LICENSE) để biết chi tiết.
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
**Được xây dựng cho lập trình viên thích giữ `rm -rf` trong tầm kiểm soát.**
|