cleatdev/cleat

GitHub: cleatdev/cleat

为Claude Code提供Docker沙箱隔离,让AI编程智能体在完全自主权限下安全运行而不危及主机系统。

Stars: 1 | Forks: 0

# Cleat [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![macOS](https://img.shields.io/badge/macOS-supported-brightgreen)](https://github.com/cleatdev/cleat) [![Linux](https://img.shields.io/badge/Linux-supported-brightgreen)](https://github.com/cleatdev/cleat) **运行一切。无损系统。** 在 Docker 沙箱中安全地运行具有完全自主权限的 AI 编程智能体。 一条命令。项目级隔离。主机零风险。 ``` curl -fsSL https://raw.githubusercontent.com/cleatdev/cleat/main/install.sh | bash ``` ``` cd ~/your-project && cleat ``` 就是这么简单。首次运行会构建 Docker 镜像(约 2 分钟),为你的项目启动一个隔离容器,并将你带入具有完全权限的 Claude Code,全部处于沙箱之中。 ``` ┌─────────────────────┐ ┌─────────────────────────────────┐ │ Your machine │ │ Docker container │ │ │ │ │ │ ~/my-project ───────────> │ /workspace │ │ ~/.claude ──────────────> │ /home/coder/.claude │ │ │ │ │ │ Everything else │ │ Claude Code runs free here: │ │ is untouched. │ │ install, build, delete, run │ │ │ │ anything. Fully sandboxed. │ └─────────────────────┘ └─────────────────────────────────┘ ``` ## 系统要求 - **[Docker](https://docs.docker.com/get-docker/)** -- 必须安装并正在运行 - **macOS 或 Linux**(通过 WSL2 支持 Windows) - **一个 [Anthropic](https://www.anthropic.com/) 账户** -- 团队版或 Pro 版 - **git** -- 安装程序使用 ## 为什么选择 Cleat? ### 问题所在 带有 `--dangerously-skip-permissions` 的 Claude Code 是使用 AI 构建软件的最快方式。没有确认对话框,没有权限提示。Claude 只是执行你的要求。但在你的实际机器上,这意味着: - 系统文件和配置可能被修改或删除 - 软件包可能被安装、升级或全系统移除 - Dotfiles、SSH 密钥或凭证可能被读取或覆盖 - 机器上的其他项目可能被访问或更改 - 一个错误的命令可能导致操作系统无法启动 ### 解决方案 Cleat 为你提供两全其美的方案: | | 无隔离 | 使用 Cleat | |---|---|---| | Claude 可以编辑项目文件 | 是 | 是 | | Claude 可以安装软件包 | 是(在你的系统上) | 是(在容器中) | | Claude 可以运行任何命令 | 是(在你的系统上) | 是(在容器中) | | Claude 可以访问其他项目 | 是 | **否** | | Claude 可以修改你的系统 | 是 | **否** | | Claude 可以读取 ~/.ssh、凭证 | 是 | **否** | | 可以安全地通宵运行 | 否 | **是** | | 文件所有权问题 | 不适用 | **无**(UID/GID 已映射) | | 复制到主机剪贴板 | 是 | **是**(通过剪贴板桥接) | ### 主要特性 - **一条命令** -- `cleat` 构建、启动并运行一切 - **项目级隔离** -- 每个项目都有自己的容器,可并行运行多个项目 - **会话持久化** -- 停止并恢复会话而不丢失上下文 - **适合无人值守使用** -- 让 Claude 通宵工作而不危及你的系统 - **零文件权限问题** -- 容器用户自动匹配你的主机 UID/GID - **共享认证** -- 登录一次,所有容器使用相同的凭证 - **剪贴板支持** -- `pbcopy`、`xclip` 和 `xsel` 垫片通过文件桥接路由到你的主机剪贴板 —— 无需 X11 或特殊终端功能 - **轻量级** -- 基于 Debian-slim 的镜像,包含 Node.js、Python、Git、build-essential、vim、jq 和 socat - **自动升级通知** -- 每天检查一次更新,并在启动 Claude 前通知你 ## 背后的故事 我曾经沉迷于 Vibe Coding。快速发布功能,让 Claude Code 使用 `--dangerously-skip-permissions` 运行,这样它就可以执行任何操作而不打断我的流程。那种体验令人难以置信。我会启动任务,走开,然后回来看到可运行的代码。我在 Mac 上运行多个项目,有时让 Claude 通宵运行,处理大型重构。 然后有一天早上,我打开笔记本电脑,一切都失灵了。系统彻底崩溃。应用程序无法启动,终端无法使用,核心系统文件被修改。Claude 通宵自主工作,在这个过程中,它开始对项目目录之外进行更改。它试图通过修改系统级配置来修复依赖项问题,进而引发了文件系统上一系列更多的“修复”。等它完成时,macOS 已经无法恢复。 我不得不从 Time Machine 备份中恢复整个机器。数小时的设置,重新认证所有内容,重建未备份的本地状态。这一切只是因为我给了 AI 对我实际系统的无限制访问权限。 问题是,我不想停止使用 `--dangerously-skip-permissions`。生产力提升是真实的。没有权限关卡的 Claude Code 是完全不同的体验:它行动迅速,安装所需的东西,运行构建和测试,针对错误进行迭代,所有这些都不需要等你点击五十次“允许”。回到默认权限模式感觉像是重新踩下了刹车。 所以我构建了 Cleat。同样无限制的权力,但在 Docker 容器内部,爆炸半径为零。Claude 可以在沙箱内执行 `rm -rf /`,而我的 Mac 甚至不会察觉。每个项目都有自己的容器,我的主机系统完全未受影响,我永远不必担心我不看的时候 Claude 做什么。 从那以后,我再也没有从备份恢复过。 ## 安装 ### 快速安装(推荐) ``` curl -fsSL https://raw.githubusercontent.com/cleatdev/cleat/main/install.sh | bash ``` 这会将仓库克隆到 `~/.cleat`,检出最新的稳定发布标签,并将 `cleat` 符号链接到你的 PATH。 ### 手动安装 ``` git clone https://github.com/cleatdev/cleat.git cd cleat git checkout "$(git tag -l | grep -E '^v[0-9]' | sort -V | tail -1)" ./bin/cleat install ``` ### 更新 版本发布为 git 标签(例如 `v0.1.0`)。更新器获取标签并检出最新的一个: ``` cleat update ``` 同时也更新容器内的 Claude Code: ``` cleat rebuild ``` ## 入门指南 ### 1. 认证(仅首次) ``` cd ~/your-project cleat # starts the container + launches Claude # 首次运行时 Claude 将提示您登录 ``` 或单独认证: ``` cleat start # start the container cleat login # opens a browser URL to sign in ``` 凭证将保存到主机的 `~/.claude`,并自动在所有容器间共享。登录一次,每个容器都能获取。 ### 2. 使用 ``` cd ~/your-project cleat ``` 就是这样。你已进入具有完全自主权限的 Claude Code,并在 Docker 中沙箱化。 ## 使用方法 ### 日常工作流 ``` # 开始新会话 cd ~/my-project cleat # 恢复上次会话 cleat resume # 检查运行状态 cleat ps # 完成后停止(保留容器以便恢复) cleat stop ``` ### 同时运行多个项目 每个项目都有自己的隔离容器: ``` # 终端 1 cd ~/backend && cleat # 终端 2 cd ~/frontend && cleat # 查看所有运行中的容器 cleat ps ``` ``` Cleat containers: ● cleat-backend-1a2b3c4d Up 12 minutes /Users/you/backend ● cleat-frontend-5e6f7a8b Up 3 minutes /Users/you/frontend ``` ### 命令参考 #### 快速开始 | 命令 | 描述 | |---|---| | `cleat` | 构建 + 运行 + 启动 Claude Code(多合一) | | `cleat resume` | 恢复最近的会话 | #### 生命周期 | 命令 | 描述 | |---|---| | `cleat stop [path]` | 停止此项目的容器(保留以供恢复) | | `cleat rm [path]` | 停止并永久移除容器 | | `cleat stop-all` | 停止所有 Cleat 容器 | | `cleat build` | 构建 Docker 镜像 | | `cleat rebuild` | 强制从头重新构建镜像 | | `cleat clean` | 停止一切并移除镜像 | | `cleat nuke` | 移除**所有**容器、镜像和构建缓存 | #### 交互 | 命令 | 描述 | |---|---| | `cleat claude [path]` | 将 Claude Code 附加到运行中的容器 | | `cleat shell [path]` | 在容器内打开 bash | | `cleat login [path]` | 通过 Anthropic (OAuth) 认证 | | `cleat logs [path]` | 查看容器日志尾部 | #### 信息 | 命令 | 描述 | |---|---| | `cleat status [path]` | 显示容器、镜像和认证状态 | | `cleat ps` | 列出所有 Cleat 容器(运行中和已停止) | | `cleat update` | 检查更新并安装最新版本 | | `cleat version` | 显示当前版本 | 如果省略 `[path]`,所有命令默认为当前工作目录。 ## 工作原理 ### 架构 ``` ┌──────────────────────────────────────────────────────────────┐ │ Your machine │ │ │ │ ~/.claude ──────────────┐ (auth, sessions, settings) │ │ ~/.claude.json ─────────┼── (config) │ │ ~/my-project ───────────┼──────────────────────┐ │ │ │ │ │ │ ┌────────────────────────┼──────────────────────┼───────┐ │ │ │ Docker container │ │ │ │ │ │ v v │ │ │ │ /home/coder/.claude /workspace │ │ │ │ /home/coder/.claude.json │ │ │ │ │ │ │ │ Claude Code (--dangerously-skip-permissions) │ │ │ │ │ │ │ │ Can: read/write project, install packages, run cmds │ │ │ │ Cannot: touch host system, access other projects │ │ │ └───────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────┘ ``` ### 组件 | 文件 | 用途 | |---|---| | `bin/cleat` | CLI 脚本(符号链接为 `cleat`) | | `docker/Dockerfile` | 包含 Claude Code(原生安装程序)的 Debian slim 镜像 | | `docker/entrypoint.sh` | 将主机 UID/GID 映射到容器中,使文件归你所有 | | `docker/clip` | 剪贴板垫片 —— 写入文件桥接(主要)或 OSC 52 守护进程(后备)。符号链接为 `pbcopy`、`xclip`、`xsel` | | `docker/clip-daemon` | 后台守护进程 —— 通过 OSC 52 将剪贴板数据中继到主机终端(支持该功能的终端的后备方案) | | `docker/CLAUDE.md` | Claude Code 的用户级说明(剪贴板用法、粘贴限制) | | `install.sh` | 单行安装程序(`curl \| bash`) | ### 运行 `cleat` 时会发生什么 1. **构建 Docker 镜像**(仅首次) -- 包含 Node.js、Python、Git、build-essential、vim、jq、socat 和 Claude Code CLI 的 Debian slim 2. **启动容器** -- 名为 `cleat--`(哈希值派生自完整项目路径),你的项目挂载在 `/workspace` 3. **映射你的 UID/GID** -- 到容器中,以便 Claude 创建的文件在主机上归你所有 4. **挂载 `~/.claude`** -- 用于所有容器间的共享认证 5. **启动剪贴板桥接** -- 主机端监视器和共享文件挂载,使 `pbcopy`/`xclip`/`xsel` 中继到你的主机剪贴板 6. **启动 Claude Code** -- 在沙箱内使用 `--dangerously-skip-permissions` ### 安全加固 容器默认使用以下保护措施运行: - `--pids-limit 1024` -- 防止 fork 炸弹影响主机 - `--memory 8g` -- 防止失控进程耗尽主机内存 - 入口点中的数字 UID/GID 验证,以防止注入攻击 - 攻击面最小的 Debian slim 基础镜像 ## 自动升级通知 Cleat 每 24 小时通过 `git ls-remote --tags` 检查一次新的发布标签(这是一个不获取任何对象的轻量级网络调用)。当有较新版本可用时,你会在 Claude Code 启动前看到通知: ``` ┌──────────────────────────────────────────────────────┐ │ Update available v0.2.0 → v0.3.0 │ │ Run cleat update to install the latest version. │ └──────────────────────────────────────────────────────┘ ``` - 此检查每天最多运行**一次** —— 不会减慢后续启动。 - 结果缓存在安装目录(`~/.cleat`)内的 `.update_check` 中。 - 该通知仅供参考 —— 绝不会中断或阻止你的工作流。 - 要升级,运行 `cleat update`。要同时更新容器内的 Claude Code,随后执行 `cleat rebuild`。 ## 剪贴板支持 剪贴板开箱即用。当 Claude Code(或任何工具)在容器内调用 `pbcopy`、`xclip` 或 `xsel` 时,文本会被复制到你的**主机机器的剪贴板** —— 无需 X11、显示服务器或特殊终端功能。 ### 工作原理 主机端剪贴板监视器会随每个 Claude Code 会话自动启动。容器通过绑定挂载将剪贴板数据写入共享文件,监视器检测到更改后,使用 `pbcopy`(macOS)、`xclip`、`xsel` 或 `wl-copy`(Linux)将内容复制到你的真实剪贴板。 ``` ┌─────────────────────────────┐ ┌──────────────────────────────┐ │ Docker container │ │ Host │ │ │ │ │ │ Claude Code │ │ │ │ └─ echo "text" | pbcopy │ │ │ │ └─ writes to ────────────> │ /tmp/cleat-clip-*/clipboard │ │ /tmp/cleat-clip/ │ │ └─ watcher detects change │ │ │ │ └─ pbcopy / xclip │ │ │ │ └─ ✔ clipboard! │ └─────────────────────────────┘ └──────────────────────────────┘ ``` 对于支持 [OSC 52](https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands) 的终端,还提供了一种后备方案,当文件桥接未激活时自动使用。 ``` # 这些操作都在容器内运行 -- 包括通过 Claude Code: echo "hello" | clip # dedicated helper echo "hello" | pbcopy # macOS-style echo "hello" | xclip -selection clipboard # Linux-style echo "hello" | xsel --clipboard # Linux-style (alternative) git log -1 --format=%B | clip # copy last commit message ``` **限制:** 有效负载上限为 100KB。粘贴(`xclip -o`、`xsel --output`、`pbpaste`)不受支持 —— 剪贴板仅支持复制。 ## 故障排除 ### 剪贴板不工作 如果容器内的 `pbcopy`/`xclip`/`xsel` 没有复制到你的主机剪贴板: 1. **检查桥接是否处于活动状态** -- 在容器内,运行 `ls /tmp/cleat-clip/.host-ready`。如果文件存在,则主机监视器正在运行。 2. **检查主机上的剪贴板命令** -- 监视器需要 `pbcopy`(macOS)、`xclip`、`xsel` 或 `wl-copy`(Linux)在你的 PATH 中可用。 3. **重建容器** -- 如果你是从旧版本升级的,运行 `cleat rm && cleat start` 以创建新的剪贴板挂载。 4. **大有效负载** -- 剪贴板上限为 100KB。对于更大的内容,将其写入 `/workspace` 中的文件并从主机复制。 ### Docker 未运行 ``` Cannot connect to the Docker daemon ``` 启动 Docker Desktop 或 Docker 守护进程,然后重试。 ### 安装时权限被拒绝 ``` # 如果 /usr/local/bin 不可写,安装程序会自动使用 sudo。 # 您也可以安装到自定义位置: ln -sf "$(pwd)/bin/cleat" ~/.local/bin/cleat ``` ### 容器命名 每个容器命名为 `cleat--`,其中哈希值派生自项目的完整绝对路径。这意味着具有相同目录名的两个项目(例如 `~/code/client-a/api` 和 `~/code/client-b/api`)会自动获得独立的容器。每次会话前会打印容器名称,让你始终知道自己身处哪个沙箱。 ### Claude Code 更新后重建 Claude Code CLI 内置于 Docker 镜像中。获取最新版本: ``` cleat rebuild ``` ### 文件以 root 身份创建 这种情况不应发生。入口点映射了你的主机 UID/GID。如果发生了,请检查 Docker 是否正确传递了 `HOST_UID` 和 `HOST_GID`: ``` cleat shell id # should show your UID/GID ``` ## 卸载 ``` cleat clean # remove all containers + image cleat uninstall # remove CLI symlinks rm -rf ~/.cleat # remove the repo clone ``` 你的项目文件和 `~/.claude` 凭证永远不会被触及。 ## 贡献 欢迎贡献!请提交 issue 或 pull request。 ``` git clone https://github.com/cleatdev/cleat.git cd cleat # 在 main 上进行更改,并在本地测试 ./bin/cleat start ~/some-test-project ``` ### 发布 通过在 `main` 上标记 commit 来发布版本: ``` git tag v0.3.0 git push --tags ``` 安装程序和更新程序都会自动解析最新的 semver 标签。不需要发布分支。 ## 许可证 [MIT](LICENSE) Cleat — 运行一切。无损系统。| AI 编程智能体的 Docker 沙箱 | cleat.sh
标签:AI编程助手, Anthropic, CIS基准, Claude Code, DevSecOps, Docker沙箱, MITM代理, MIT许可, Web截图, 上游代理, 主机防护, 代码隔离, 容器安全, 应用安全, 开发环境, 提示词注入, 终端工具, 网络安全研究, 自动化代理, 虚拟化, 请求拦截, 逆向工具, 零信任执行