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/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.**