cc-bridge
Health Uyari
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Basarisiz
- rm -rf — Recursive force deletion command in .github/scripts/mac-updater-e2e.sh
- fs module — File system access in .github/scripts/mac-updater-e2e.sh
- process.env — Environment variable access in .github/workflows/build.yml
- fs module — File system access in .github/workflows/build.yml
- process.env — Environment variable access in desktop/scripts/build-design-preview.mjs
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
把桥装在文件所在的那台机器上,让 Claude Code / Codex 从任何地方接入:云主机上跑 AI,直接改你本机 Windows/macOS 的代码——代码不出本机、不用 scp、不用 SSHFS。白名单 + 审计日志 + 自动备份 + 内置 HTTPS 自签。4.5MB 桌面应用。
cc-bridge — 把桥装在文件所在的地方,让 AI 从任何地方接入
English | README.en.md
一座双向 MCP 桥:装在文件所在的那台机器上(Windows / macOS 桌面应用),Claude Code / Codex / WorkBuddy 等任意 MCP 客户端从任何地方接入——
模式 A:远程 Linux 上的 Claude Code 直接读写你本地 Windows/macOS 的文件(免 scp、免 SSHFS);
模式 B:你本地 AI 的工具接进家里 NAS / 公司 Windows 工作机的文件与环境(跨公网走内置 HTTPS 自签)。
全程有路径白名单、审计日志、自动备份、一键还原。安装包 4.5MB(Windows)/ 5.7MB(macOS)。
界面一览
| 连接页 | 安全页 | 设置页 | 日志 / 审计页 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
以上为 v2.10.0 Windows 实际界面:连接工作台、安全与白名单、设置(关于页)、审计日志。原图存放于
docs/images/。
这是什么
cc-bridge 是一个运行在「文件所在机器」上的 MCP(Model Context Protocol)桥接服务,以原生桌面应用形式运行(Tauri 2)。支持 Windows 10/11 与 macOS(Apple Silicon),同一套 Rust 代码,两个平台功能一致(防火墙一键放行等 Windows 专属功能除外,详见 已知差异)。任意支持 MCP 的 AI 工具(Claude Code / Codex / WorkBuddy / 通用客户端)通过 MCP 端点接入后,可以直接操作这台机器上白名单内的文件与环境——同一个软件,两个方向都能用。
背景 / 解决的问题
模式 A(最常见):团队在本地(Windows / macOS)写代码,Claude Code 部署在远程 Linux 上。原来的痛点:
- 文件传输效率低:每次改动都要 scp,大文件慢,容易版本混乱。
- SSHFS 不稳定:网络一断挂载点卡死,终端被阻塞。
- 缺少智能化操作:只能终端命令操作文件,没有批量重构、代码分析能力。
- 操作无法审计:不知道 Claude 改了哪些文件,误操作后无法追溯恢复。
模式 B(反方向):你的 AI(Claude Code / Codex…)在云端或笔记本上,但目标环境在另一台 Windows/macOS 机器上——家里的工作机、公司的台式机、跑着特定工具链的 Mac。ssh 过去操作 Windows 很别扭,SFTP 一堆手工步骤。cc-bridge 装在那台机器上,AI 从任何地方接进来,同样的白名单 + 审计 + 备份保护,跨公网时用内置的 HTTPS 自签加密。
两种模式怎么选
| 问题 | 模式 A(远程 AI → 本地文件) | 模式 B(本地 AI → 远程文件) |
|---|---|---|
| AI 跑在哪 | 远程 Linux 服务器(租的 VPS / 公司集群) | 你的笔记本 / 本机 |
| 要操作的文件在哪 | 本地这台 Windows/macOS | 另一台 Windows/macOS(家里、公司) |
| 是否跨公网 | 通常否(同一内网 / VPN) | 通常是(不同网络) |
| 传输安全 | HTTP + Bearer(内网) | HTTPS 自签(内置,一键开启)或反向代理 + Let's Encrypt |
| 桥装在哪 | 你的本地开发机 | 目标机器(文件所在的那台) |
核心原则只有一条:桥装在文件所在的那台机器上,AI 从对面接过来。 两个方向用的是同一个安装包、同一套安全模型。
三个真实场景
| 场景 | AI 跑在哪 | 代码 / 文件在哪 | 用哪套 |
|---|---|---|---|
| 云主机上的 Claude Code 改我本机的代码(最常被问的一个) | 租的 VPS / 公司集群 | 你手边的 Windows / macOS | 模式 A |
| 家里用笔记本改公司工作机上的项目 | 笔记本 | 公司那台 Windows 台式机 | 模式 B |
| 本地 AI 整理 NAS / 另一台 Mac 上的素材 | 本机 | 远处的另一台机器 | 模式 B |
第一种具体是这样跑起来的(五步,都在一分钟内):
- 文件所在的本机装 cc-bridge(4.5MB,双击装完即启动);
- 连接页给出 MCP 端点和 Bearer 令牌,在云主机的 Claude Code 里加一条 MCP 配置(内网直连,或走内置 HTTPS 自签);
- 之后你在 CC 里说「读一下
src/app.tsx」「把这三处改掉」,这些工具调用落在你本机——代码从来没有上传到云上,编辑器里能立刻看到改动; - 每次写入都有审计记录与自动备份,改错了可以按组还原;
- 白名单以外一律拒绝,AI 碰不到你不想让它碰的目录。
换句话说:AI 在哪里跑不重要,文件始终待在它原来的地方。 把 CC 放在云主机上是为了算力和网络,不是为了把代码交出去。同样这套也适合「公司规定代码不出内网,但想用云端大模型」的情形。
快速开始(约 1 分钟)
第 1 步(两个模式相同):在文件所在的那台机器上下载安装。到 Releases 按系统选一个:
| 系统 | 下载 | 安装 |
|---|---|---|
| Windows 10/11 | cc-bridge_x.x.x_x64-setup.exe |
双击安装并启动 |
| macOS(Apple Silicon) | cc-bridge_x.x.x_aarch64-apple-darwin.zip |
解压后拖进「应用程序」;首次打开会被系统拦下,先看 macOS 安装与更新说明 |
国内用户:GitHub 下载慢的话走 Gitee 镜像
gitee.com/lzul/cc-bridge 的 releases 分支(发版时由 CI 自动同步到latest/目录)。
注意那里只有 Windows 的.exe与 mac 的.app.tar.gz(自动更新用的包,解开也能用),
没有 mac 的.zip——mac 首次安装请从 GitHub Releases 拿。
安装后的自动更新也是 Gitee 优先,失败才退回 ghproxy / GitHub,无需手动配置。
暂无 Intel Mac(x86_64)和 Linux 构建。
第 2 步:打开「安全」页 → 点「浏览」把要开放的工作目录加进白名单(默认拒绝一切访问,安全优先)。
模式 A:远程 AI → 读写本地文件(同一内网 / VPN)
- 切到「连接」页,复制给出的
claude mcp add ...命令。 - 粘贴到远程 Linux 终端执行,Claude Code 立刻就能读写你本机的文件了。
仅建议在同一内网 / VPN 下使用,不要暴露到公网(详见文末「已知限制」)。
模式 B:本地 AI → 接入远程机器的文件(跨公网)
- 在 cc-bridge 的「设置 › 安全 › HTTPS 远程访问」一键开启 HTTPS:自动生成自签证书(绑定本机网卡 IP),显示 SHA-256 指纹。
- 在装桥那台机器的面板「连接」页选你的 AI 工具,复制对应的配置片段(URL 已自动切
https://);再把 URL 与 token 抄进你本地 AI 工具的配置里。 - 核对指纹:把设置页显示的证书指纹与你本地记录的比对一致后再连,防中间人。
- 接入方式按工具不同——Claude Code 用 CLI 命令(配
NODE_EXTRA_CA_CERTS信任自签证书)、Codex 写~/.codex/config.toml、WorkBuddy 写~/.workbuddy/mcp.json,详见 兼容性矩阵。
公网暴露面有底线保护:远程访问开启时强制强 token、连续 401 自动封禁 IP(默认 5 次 → 15 分钟)、路径白名单 fail-closed。有域名时也可改走反向代理 + Let's Encrypt(模板)。
架构
模式 A:远程 AI → 本地文件 模式 B:本地 AI → 远程文件
┌──────────────────────┐ ┌──────────────────────┐
│ 远程 Linux(Claude Code)│ │ 你的笔记本(Claude Code / Codex)│
└──────────┬───────────┘ └──────────┬───────────┘
│ MCP / Streamable HTTP │ MCP / HTTPS(自签或反代)
│ (同一内网 / VPN 直连) │ (跨公网,TLS 加密)
▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ 文件所在机器(Windows / macOS) │
│ │ │
│ └─ cc-bridge.exe / cc-bridge.app ── 单进程 Tauri 2 桌面应用 │
│ │ │
│ ├─ 嵌入式 axum HTTP(S) 服务器 ── MCP JSON-RPC + 24 个工具 │
│ │ + 安全校验 + 自动备份 + 限流 + 401 封禁 + 审计 │
│ ├─ SQLite 配置存储 ── 原子更新,无竞态 │
│ └─ React 前端 ── Tauri IPC 通信,管理面板 │
└─────────────────────────────────────────────────────────────┘
同一个安装包、同一个端口、同一套安全模型——方向只取决于 AI 在哪一侧、文件在哪一侧。
关键架构决策:
- 纯 Rust 后端编译进 Tauri 二进制,不再有 Node.js sidecar(安装包 4.5MB / mac zip 5.7MB)
- 单一代码库跑两个平台:平台差异用
cfg(windows)/cfg(target_os = "macos")在 Rust 侧切开,前端按后端下发的平台信息隐藏不适用的开关,CI 在 windows-latest 与 macos-latest 上各跑一遍 clippy + 测试 - axum 嵌入 Tauri 进程:对外暴露 HTTP 端口供远程 AI 工具连接
- 前端走 Tauri IPC:不走 HTTP,token 只用于远程认证
- SQLite 替换 config.json:原子更新,无 read-modify-write 竞态
- 审计日志保持 JSONL 文件:append-only,人类可读
交互流程
启动流程
用户双击 cc-bridge.exe / 打开 cc-bridge.app
│
▼
tauri::Builder
│
├─ 1. single-instance 检查
│ └─ 已有实例运行 → 激活已有窗口,本次退出
│
├─ 2. setup() 初始化
│ ├─ 创建 AppData 目录
│ ├─ db::init_database()
│ │ ├─ 创建 SQLite config 表
│ │ └─ 检测 config.json → 自动迁移到 SQLite
│ ├─ config::load_config() → 加载 BridgeConfig
│ ├─ 构建 AppState(DB / Config / Locks / Stats)
│ │
│ ├─ spawn axum HTTP 服务器
│ │ └─ 监听 0.0.0.0:7823,路由 /health + /mcp
│ │
│ ├─ 创建主窗口 (1080×820),加载 React 前端
│ │
│ └─ 创建系统托盘
│ 菜单: 打开面板 / 重启服务 / 退出
│
├─ 3. on_window_event
│ └─ 点关闭 → 隐藏窗口(不退出进程)
│
└─ 4. run() → Tauri 事件循环
两条通信路径
cc-bridge 内部有两条独立的通信路径,共享同一个 AppState:
┌─────────────────────┐ ┌──────────────────────────────────┐
│ 远程 Linux 服务器 │ │ 本地 Windows / macOS │
│ │ │ │
│ Claude Code │ HTTP / TCP │ cc-bridge (单进程) │
│ (MCP 客户端) │────────────────▶│ │
│ │ 内网:7823 │ ┌─ axum HTTP 服务器 ─┐ │
│ 通过 MCP 协议 │ │ │ POST /mcp │ │
│ 调用 24 个 MCP 工具 │ │ │ Bearer token 认证 │ │
│ │ │ │ JSON-RPC dispatch │ │
└─────────────────────┘ │ │ → 24 个工具处理器 │──┐ │
│ │ → 安全校验 │ │ │
│ │ → 审计日志 │ │ │
│ └────────────────────┘ │ │
│ │ │
│ ┌─ Tauri WebView ──┐ │ │
│ │ React 前端 │ │ │
│ │ invoke() ───────┼─┐ │ │
│ │ (Tauri IPC) │ │ │ │
│ └──────────────────┘ │ │ │
│ ▼ │ │
│ ┌─ Rust 后端 ───────┐ │ │
│ │ #[tauri::command] │ │ │
│ │ 23 个 IPC 命令 │◀──┘ │
│ │ │ │
│ │ AppState ◀───────┼── 共享 │
│ │ (DB/Config/Stats)│ │
│ └──────────────────┘ │
│ │
│ ┌─ 本地文件系统 ─────┐ │
│ │ C:\work\... │◀─────────┘
│ │ D:\projects\... │ 读/写/删/搜
│ └───────────────────┘
└──────────────────────────────────┘
关键设计:两条路径共享同一个 AppState——远程 AI 工具的文件操作会实时反映在本地面板的审计日志和统计数据中。
MCP 工具调用链路
远程 AI 工具调用文件工具时的完整请求链路:
远程 Linux:
claude mcp add --transport http cc-bridge http://192.168.1.100:7823/mcp \
--header "Authorization: Bearer abc123..."
AI 工具对话中触发工具调用:
│
▼
POST /mcp ── initialize (首次连接握手)
│ 返回 capabilities + serverInfo
▼
POST /mcp ── notifications/initialized (握手完成)
│
▼
POST /mcp ── tools/list (发现可用工具)
│ 返回 24 个工具的 name + description + inputSchema
▼
POST /mcp ── tools/call (实际调用)
│
├─ auth_middleware
│ └─ 验证 Bearer token(常量时间比较)
│
├─ rate_limiter
│ └─ 滑动窗口检查(100次/分钟)
│
├─ dispatch_tool()
│ ├─ resolve_safe_path() ← canonicalize + 白名单校验
│ ├─ assert_extension_allowed() ← 扩展名检查
│ ├─ assert_file_size_ok() ← 大小限制
│ ├─ path_lock (写操作) ← DashMap 并发锁
│ ├─ backup (写/删操作) ← 自动备份
│ └─ 执行实际文件操作
│
├─ audit::write_audit_log() ← 追加 JSONL
│
└─ stats.increment_requests() ← 更新统计
│
▼
返回 JSON-RPC 响应 → AI 工具拿到结果
用户操作场景
首次使用
1. 安装并启动 cc-bridge
2. 主窗口打开,白名单为空(安全默认:拒绝所有操作)
3. 进入"安全"页,在白名单根目录点"浏览…"
→ DirectoryBrowser 弹窗 → 导航选择工作目录 → 添加
4. 回到"连接"页,选择 scope(全局 / 项目级),复制连接命令
5. 粘贴到远程 Linux 终端执行,AI 工具连上 cc-bridge 即可开始工作
日常使用
开机 → 双击 cc-bridge → 窗口打开,MCP 服务器自动启动
→ 远程 AI 工具自动重连
→ 最小化到托盘(点 X = 隐藏,不退出)
两件事并行:
┌── 远程 AI 工具在后台读写文件
│ 每次操作 → 审计日志 + 统计计数
│
└── 用户偶尔打开面板查看
面板每 5s 轮询状态,审计日志每 10s 轮询
改端口/地址
用户在"设置 → 网络"改 port 7823 → 9000,点"保存并重启服务"
→ save_config 检测 port 变更 → 写入 SQLite(restartRequired: true)
→ 前端自动调用 restart_mcp_server
→ abort 旧 axum → sleep 300ms → spawn 新 axum 监听 9000
→ 连接命令自动更新,远程需重新 claude mcp add
系统托盘
托盘图标右键:
打开面板 → 显示/聚焦主窗口
重启服务 → 杀旧 axum task + 重新启动
退出 → 真正结束进程(唯一的退出方式)
数据流向
┌────────────────┐
│ SQLite DB │
│ (config 表) │
└───────┬────────┘
│ load / save
▼
┌──────────┐ IPC ┌──────────────┐ HTTP ┌─────────────┐
│ React UI │◀──────▶│ AppState │◀───────▶│ 远程 Claude │
│ (WebView)│ invoke │ (内存) │ /mcp │ Code │
└──────────┘ │ │ └─────────────┘
│ ┌─ config ─┐ │
│ │ RwLock │ │
│ ├─ stats ──┤ │
│ │ RwLock │ │
│ ├─ locks ──┤ │
│ │ DashMap │ │
│ └──────────┘ │
└──────┬───────┘
│ read / write
▼
┌──────────────┐
│ 本地文件系统 │ 白名单目录内
└──────┬───────┘
│
▼
┌──────────────┐
│ audit.log │ JSONL 追加写入
│ .bak 备份 │ 写/删前自动备份
└──────────────┘
功能清单
24 个 MCP 工具(任意接入的 AI 工具直接调用)
| 工具 | 作用 |
|---|---|
list_allowed_roots |
列出服务端白名单(允许根目录 + 扩展名 + 大小上限),远程首选调用以发现可访问范围,免盲猜 |
list_directory |
列目录,支持递归 + 深度限制 |
read_files |
批量读文件,支持指定行范围(1-based);返回内容 + 编码 + 换行风格;「读取编码自适应」开关开启时自动识别 GBK/GB18030 统一转 UTF-8(默认关,按 UTF-8 读),可传 encoding 强制指定(始终生效)。🔴 单次结果超过约 45,000 字符(按最终上线口径计,含 JSON 两层转义,换行/引号密集的文件实际可用余量更小)时不返回正文,改返回可执行的指引(文件字节数 / 总行数 / 分段读取示例)——这么大的结果会被客户端整条降级成 2KB 预览,返回残文反而会让 AI 以为读到了完整文件 |
write_files |
批量写/新建文件,自动建父目录,覆盖前自动备份;diff 控制改动回显量(默认新建文件只回 +N/-M 行、覆盖回截断 hunk,full 回到逐行全文,none 完全不回) |
edit_files |
精准字符串替换(对标 native Edit),oldString 需唯一匹配(或 replaceAll),保留原文件编码(GBK 改完仍 GBK),改前备份;encoding 可按次强制编码(GBK 项目不必改全局开关),expectCount 断言出现次数——不符合时整条拒写并报实际次数与行号;同样支持 diff 回显档位 |
notebook_edit |
编辑 Jupyter 笔记本(.ipynb):按索引替换/插入/删除单元格,保留其它元数据 |
delete_files |
批量删除文件(不删目录),删前自动备份 |
move_files |
批量移动/重命名,跨盘自动 copy+delete 降级 |
copy_files |
批量复制,目标已存在则先备份 |
create_directory |
创建目录(含缺失父目录),幂等 |
remove_directory |
删除目录,默认仅删空目录,recursive=true 递归删除整树(危险,不备份) |
search_files |
按文件名 glob + 内容关键字/正则全文搜索;带软超时 deadlineMs(默认 20 秒,0 不限时)——超时不报错,返回已找到的部分结果并在最前面注明「结果不完整、不要据此判断不存在」 |
batch |
一次往返批量执行多个工具调用,把 N 次网络往返合并为 1 次(远程链路最大延迟优化);每个子操作复用同样的白名单 / 只读校验;非事务,出错即停但不回滚已完成写入。整条返回的子结果内容超过约 46,000 字符时按顺序内联、放不下的子结果换成 omitted:true 占位并指明单独调用哪个工具取回(error 子结果优先完整——另有 2KB 溢出额度,额度也耗尽才并入末尾聚合条目并注明条数与原因;绝不把 JSON 切碎;预算不会比单条 read_files 更严,避免「单独能读到、放进 batch 反被省略」) |
analyze_file |
编码检测 + 语言识别 + 函数/类数量启发式估算 |
view_image |
把图片(png/jpg/gif/webp/bmp)当图片返回给 AI,而不是 base64 文本——一张图约一两千 token,同一张图转 base64 文本要十几万字符。支持 crop 按原图像素裁剪、maxWidth 等比缩放(默认 1600)、format 选 png/jpeg;核对截图、渲染效果、图表时用它,别再让 AI 手写截图脚本 |
prepare_upload |
签发一次性上传地址:给桥端目标路径,跑返回的 curl -T 命令把文件直接推过来,字节不经过对话上下文(169KB 的 pptx 走 base64 要十几万 token,直传只要几十个)。发票据时已校验白名单/扩展名/只读/大小/覆盖;上传流式落盘、边写边算 sha256(传 sha256 由服务端比对,不符整次作废)、超限立即中止、覆盖前自动备份、临时文件原子改名。票据一次性、默认 5 分钟失效 |
prepare_download |
签发一次性下载地址:返回文件大小 + sha256 + 可直接执行的 curl -o 命令,字节同样不过上下文。二进制/大文件(图片、Office 文档、压缩包)用它替代 read_files |
run_command |
执行 Shell 命令(壳层按平台与配置:Windows = cmd /C 或 Git Bash,macOS = sh / bash),前台等待结果或 background=true 后台运行;前台输出可用 include / exclude 正则与 tailLines 在服务端过滤,被剔除的行只报数量;默认关闭,需在『安全』页开启「命令执行」开关(等同于授予远程任意代码执行权限),只读模式下无条件禁止 |
get_command_output |
增量拉取后台命令的 stdout/stderr(按偏移量),附带是否已结束、退出码;同样支持 include / exclude / tailLines 服务端过滤 |
wait_command |
等后台命令结束再一次性返回(timeoutSec 默认 120、上限 600),支持 untilPattern 命中即返回(如等到 EXIT=\d+)与输出过滤;超时不杀进程(timedOut:true + running:true,可继续等)。长构建用它替代反复轮询 get_command_output |
stop_command |
强制终止一个后台命令的整个进程树(Windows = TerminateJobObject,macOS = 向整个 POSIX 进程组发 SIGKILL,孙进程一并死);终止后条目保留到清理宽容期(默认 120s),所以被杀进程的最后一段输出仍能用 get_command_output 取回,重复调用幂等(alreadyFinished) |
push_notification |
向本机推桌面通知(Windows = 系统 toast,macOS = 通知中心),让远程 AI 工具干完活能主动叫你;编译期 notifications feature 关闭时不注册 |
mcp_list_servers |
列出经桥接入的外挂 MCP server(本机已装的工具,如代码索引、文档检索)及其暴露的工具清单;默认返回紧凑索引,可按 server/tool 展开完整 inputSchema |
mcp_proxy |
调用某个外挂 MCP server 上的工具(先用 mcp_list_servers 发现)。⚠️ 外挂 server 是独立进程,不受路径白名单约束、桥无法审计其文件操作,仅审计转发调用本身;只读模式下整体禁用 |
SSH 终端(本地人操作,非 MCP 工具)
第 4 个 Tab「终端」提供一个真正的交互式终端,让你在 cc-bridge 面板里直接连远端 Linux 敲命令——这是给人手动用的,不是给 AI 用的 MCP 工具(所以不计入上面的 24 个 MCP 工具)。
- 后端:调用本机系统自带 OpenSSH(Windows 10/11 自带
C:\Windows\System32\OpenSSH\ssh.exe,macOS 永远有),用portable-pty开本地 PTY(Windows = ConPTY / Unix = pty)把 ssh 的输入输出接到 xterm.js。零新网络协议、零重依赖,体积代价可忽略(portable-pty 0.9 只引windows-sys0.61.2 等小库)。 - 连接:支持两种认证方式——
- 密码:名称 / 主机 / 端口 / 用户名 / 密码,可勾「记住密码」——密码用 aes-gcm 加密后落盘(密钥在
data_dir/ssh_key.bin,明文不出本地进程)。 - 密钥:选「密钥」认证后填私钥路径(
id_rsa/id_ed25519等)+ 可选密码短语(passphrase)。有 passphrase 时同样经 aes-gcm 加密落盘,ssh 握手时由 PTY 自动填充。后端在 key 模式下给ssh加-i <keyfile>,并用IdentitiesOnly=yes避免 agent 干扰。
- 密码:名称 / 主机 / 端口 / 用户名 / 密码,可勾「记住密码」——密码用 aes-gcm 加密后落盘(密钥在
- 交互:xterm.js 渲染,
TERM=xterm-256color+ 中文 UTF-8;窗口缩放走 PTYresize;ServerAliveInterval=30 / ServerAliveCountMax=3保活防断;复制粘贴走 WebView 剪贴板。 - 多标签终端:每个 SSH 连接一个独立 xterm 实例 + 会话标签(顶部可切换/关闭),后台连接保持不断开;点连接自动新建标签,断线后标签标红。
- SFTP 文件管理:每个连接带「文件」按钮,弹出文件浏览器抽屉——列目录(解析
ls -la)、进入上级/子目录、上传/下载(走scp -t/scp -f子协议)、新建目录、删除。本地路径用输入框(不引原生文件选择器插件,零新增 Rust crate)。 - 安全闸:
ssh_enabled总开关默认关,首次进终端页弹启用确认(锁图标 + 风险说明)。凭据仅经 Tauri IPC 写入本机,明文字段绝不经通用save_config补丁,也不经 MCP 暴露给远端。SFTP 与终端共用同一开关与连接池。 - 连接池:复用
AppState的DashMap管理 SSH 会话,60s GC 回收已退出的僵尸会话(含 SFTP 用的无屏 PTY 子进程)。 - 新增 13 个 Tauri IPC 命令(终端 8 + SFTP 5):
ssh_check/ssh_list_connections/ssh_save_connection/ssh_delete_connection/ssh_connect/ssh_input/ssh_resize/ssh_disconnect+ssh_sftp_list/ssh_sftp_get/ssh_sftp_put/ssh_sftp_mkdir/ssh_sftp_remove(见上「Tauri IPC 命令」表)。
⚠️ Windows 极少数精简镜像 / 旧 Win10 可能没装 OpenSSH。
ssh_check返回 absent 时前端弹降级卡,按提示用Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0(需管理员)安装即可。
安全机制
- 路径白名单(
allowedRoots):只能访问明确允许的根目录,canonicalize()防软链接逃逸,祖先遍历防路径穿越。被拒时错误信息会附带当前白名单(Allowed roots: ...),远程无需盲猜即可得知可访问范围。 - 扩展名白名单(
allowedExtensions):大小写不敏感匹配,留空表示不限制。 - Bearer token 认证:
subtle::ConstantTimeEq防时序攻击,32 位随机字母数字。 - 限流:
DashMap滑动窗口,默认 100 次/分钟,超限 429。 - 自动备份:写/删/覆盖前备份到配置目录,按时间戳命名,超出保留数自动清理。
- 审计日志:JSONL 格式,记录每次操作的时间/工具/参数/结果/来源 IP/耗时(
durationMs);成功与失败调用均记录真实参数;按保留天数(默认 30 天,0=永久)在启动时自动清理。 - 单文件大小上限:默认 20MB。
- 写锁:
DashMap<PathBuf, Arc<Mutex<()>>>,同一文件并发写串行化。 - 401 封禁:远程访问开启时,连续 5 次认证失败封禁来源 IP(默认 15 分钟窗口,成功认证即清零),防爆破。
传输安全(模式 B 必读)
- 默认 HTTP + Bearer:明文传输,只适合内网 / VPN,不要暴露公网。
- 内置 HTTPS 自签(「设置 › 安全 › HTTPS 远程访问」一键开启):rcgen 自签证书(825 天,SAN 绑定全部网卡 IP + 127.0.0.1),跨公网全程 TLS。接入侧务必核对设置页显示的 SHA-256 指纹防中间人;各 AI 工具对自签证书的信任路径见 兼容性矩阵。
- 反向代理 + Let's Encrypt(有域名时推荐):桥只出 HTTP,由 Caddy / nginx 终结 TLS,模板见 reverse-proxy.md。
- 公网底线组合:强 token 强制轮换 + 401 封禁 + 路径白名单 fail-closed(空名单拒绝一切)+ 写类工具可关 + 命令执行默认关。
HTTP 接口
| 路径 | 方法 | 认证 | 作用 |
|---|---|---|---|
/mcp |
POST | Bearer token | MCP JSON-RPC 入口(Streamable HTTP,默认传输) |
/mcp/sse |
GET | Bearer token | MCP JSON-RPC 入口(HTTP+SSE 传输;规范已弃用,仅存量配置保留) |
/mcp/messages |
POST | Bearer token(或 URL 内置 token) | SSE 传输的上行消息端点 |
/health |
GET | 不需要 | 存活检测 |
Tauri IPC 命令(前端 → 后端)
| 命令 | 作用 |
|---|---|
get_status |
版本/运行时间/配置/统计/连接命令 |
save_config |
局部更新配置,检测 host/port 变更返回 restartRequired |
regenerate_token |
重新生成 token |
get_audit_log |
最近 N 条审计日志 |
browse_directory |
全盘目录浏览(不受白名单限制,用于目录选择器) |
restart_mcp_server |
杀旧 axum task + 按新配置重启 |
get_lan_ips |
获取局域网 IP 列表 |
get_autostart / set_autostart |
读取 / 设置开机自动启动(tauri-plugin-autostart) |
ssh_check |
检测本机是否装有 OpenSSH 客户端(Windows 查 System32/SysWOW64\OpenSSH\ssh.exe,mac 永远有) |
ssh_list_connections |
列出已保存的 SSH 连接(名称 / user@host:port,不含密码) |
ssh_save_connection |
新增 / 更新连接;密码由后端用 aes-gcm 加密后落盘(明文不经过通用 save_config 补丁) |
ssh_delete_connection |
删除一个已保存的连接(含其加密密码) |
ssh_connect |
用系统 ssh + 本地 PTY 建立交互会话,reader 线程把输出经 ssh_output 事件推给前端,检测 password: 提示自动填记住的密码 |
ssh_input |
把 xterm 的按键转发进 PTY(密码在本地 typed,不回显) |
ssh_resize |
PTY 跟随窗口缩放(resize) |
ssh_disconnect |
关闭会话,杀掉 ssh 子进程 |
ssh_sftp_list |
列远程目录(走 ssh + ls -la PTY 子进程,解析为结构化条目:名称/大小/权限/mtime/类型) |
ssh_sftp_get |
下载远程文件到本地(scp -f 协议,PTY 自动填密码/密码短语,含超时与错误输出收集) |
ssh_sftp_put |
上传本地文件到远程(scp -t 协议,同上) |
ssh_sftp_mkdir |
远程新建目录(mkdir -p) |
ssh_sftp_remove |
远程删除文件/目录(rm -rf,危险操作,前端二次确认) |
管理面板(React 前端)
界面采用 shadcn/ui 设计语言,顶部 Tab 分页布局,共 5 个页面:
- 连接:状态概览(请求数/错误数/运行时间,运行时间精确到秒且平滑跳秒)+ 高对比启停服务按钮(loading 态 + 失败内联报错)+
claude mcp add命令一键复制 + 全局/项目级 scope 选择 + Token 掩码显示/重新生成 - 安全:白名单根目录 CRUD + 目录浏览器弹窗;扩展名/文件大小/限流/备份目录/备份保留,全部即时保存(防抖 800ms + 失焦)
- 设置:网络(host/port,改后一键保存并重启)+ 应用(开机自启开关)+ 审计(日志保留天数)
- 日志:审计日志表,6 列(时间 / 操作 / 参数摘要 / 来源 / 耗时 / 状态);操作列显示中文名(如「读取文件」)+ 原始工具名;支持按操作/状态下拉筛选 + 关键字搜索(匹配参数与错误)+ 一键导出 JSON;点击行展开结构化详情(参数 KV + 格式化 JSON + 复制 + 错误块)
- 终端:SSH 终端(第 4 个 Tab,Ctrl+4)。人在面板里手动操作远端 Linux 的终端——左栏 SSH 连接列表(名称 + user@host:port + 在线/离线点),右栏 xterm.js 深色终端(复制 / 清屏 / 断开)。支持密码登录、记住密码(aes-gcm 加密落盘)、窗口缩放、
ServerAliveInterval保活;总开关ssh_enabled默认关,首次进入弹启用确认(遵循「默认关 + 多层闸」)。仅本地 Tauri IPC 调用,不经过 MCP,远端 AI 工具无法用它 - 深色/浅色主题切换(localStorage 持久化)
技术栈
| 层 | 技术 |
|---|---|
| 桌面框架 | Tauri 2(用系统 WebView:Windows = WebView2 / macOS = WKWebView) |
| 后端语言 | Rust |
| HTTP 服务器 | axum 0.8 + tower-http |
| 异步运行时 | tokio |
| 配置存储 | SQLite(rusqlite bundled) |
| 并发控制 | DashMap 6 |
| PTY | portable-pty 0.9(Windows ConPTY / Unix pty,SSH 终端用) |
| 加密/安全 | subtle 2 + rand 0.8 + aes-gcm 0.10(SSH 密码落盘加密) |
| 前端框架 | React 18 + TypeScript |
| 构建工具 | Vite 6 |
| 样式 | TailwindCSS 4 + shadcn/ui 设计语言(手写基础组件) |
| 数据获取 | TanStack Query 5(5s 轮询) |
| 终端渲染 | xterm.js 5 + xterm-addon-fit(SSH 终端) |
| 打包 | Windows:NSIS 安装包;macOS:.app + ditto 打的 zip |
| 平台 | Windows 10/11、macOS(Apple Silicon) |
目录结构
cc-bridge/
├── README.md # 本文档
└── desktop/ # 完整 Tauri 2 桌面应用
├── package.json # 前端依赖 + tauri CLI
├── vite.config.ts # Vite 配置(端口 1420)
├── tsconfig.json
├── index.html
├── src/ # React 前端源码
│ ├── main.tsx
│ ├── App.tsx # 主应用 + TanStack Query
│ ├── index.css # TailwindCSS + 主题变量
│ ├── lib/
│ │ ├── tauri.ts # invoke() 类型封装
│ │ └── types.ts # TypeScript 类型定义
│ └── components/
│ ├── layout/Header.tsx # 状态指示/版本/运行时间/主题切换
│ ├── ui/ # 手写 shadcn 风格基础组件
│ │ ├── button.tsx / input.tsx / label.tsx
│ │ ├── card.tsx / badge.tsx / alert.tsx
│ │ ├── tabs.tsx / dialog.tsx / table.tsx / separator.tsx
│ ├── tabs/ # 5 个 Tab 页面 + 拆分子组件
│ │ ├── ConnectTab.tsx
│ │ ├── ConnectHero.tsx # 连接页 Hero 卡(状态/指标/启停按钮)
│ │ ├── SecurityTab.tsx
│ │ ├── SettingsTab.tsx # 网络 + 应用(开机自启) + 审计
│ │ ├── SettingsToggles.tsx # 设置页功能开关卡
│ │ ├── LogTab.tsx
│ │ ├── TerminalTab.tsx # 第 4 个 Tab:SSH 终端(连接列表 + xterm)
│ │ ├── SshTerminal.tsx # xterm.js 终端组件(输入/输出/缩放/复制清空)
│ │ └── SshConnectionDialog.tsx # 新建/编辑 SSH 连接弹框
│ └── modals/
│ └── DirectoryBrowser.tsx # 目录浏览器弹窗
└── src-tauri/ # Rust 后端
├── Cargo.toml
├── tauri.conf.json
├── capabilities/default.json
├── icons/ # 占位图标(发布前用 tauri icon 替换)
└── src/
├── main.rs # Tauri 入口 + 系统托盘 + 窗口管理
├── lib.rs # 模块声明
├── state.rs # AppState(DB/Config/Locks/Stats)
├── db.rs # SQLite 初始化 + config.json 迁移
├── config.rs # BridgeConfig 结构体 + 读写
├── commands.rs # #[tauri::command] IPC 接口聚合(含开机自启 + SSH 终端)
├── commands/ # IPC 命令按职责拆分,commands.rs 用 `pub use` 聚合
│ └── ssh_cmds.rs # SSH 终端 8 个命令:ssh_check/list/save/delete/connect/input/resize/disconnect
├── ssh_crypto.rs # SSH 密码 aes-gcm 加密/解密(落盘用,密钥在 data_dir/ssh_key.bin)
├── backup.rs # 文件备份 + 自动清理
├── audit.rs # JSONL 审计日志
├── browse.rs # 全盘目录浏览(Windows 枚举盘符 / macOS 从 / 起)
├── network.rs # LAN IP 检测 + connect 命令
├── security/ # 安全模块
│ ├── mod.rs
│ ├── path.rs # 路径校验 + canonicalize
│ ├── extension.rs # 扩展名白名单
│ ├── filesize.rs # 文件大小限制
│ ├── auth.rs # 常量时间 token 校验
│ └── ratelimit.rs # 滑动窗口限流
└── mcp/ # MCP 协议实现
├── mod.rs
├── http.rs # axum 路由 + JSON-RPC dispatch
├── transfer.rs # 文件直传:一次性票据 + PUT|GET /transfer/{ticket}
└── tools/ # 24 个工具处理器
├── mod.rs
├── list_allowed_roots.rs
├── list_directory.rs
├── read_files.rs
├── write_files.rs
├── edit_files.rs
├── delete_files.rs
├── move_files.rs
├── copy_files.rs
├── create_directory.rs
├── remove_directory.rs
├── search_files.rs
├── analyze_file.rs
├── run_command.rs
├── get_command_output.rs
├── wait_command.rs
├── view_image.rs
└── stop_command.rs
部署流程
前置条件
- Windows 10/11,或 macOS(Apple Silicon)
- Rust 工具链(
rustup.rs) - Node.js 18+(仅构建时需要)
构建 & 运行
Windows:
cd desktop
npm install
npm run build # cargo tauri build → 产出 NSIS 安装包
产出路径:src-tauri/target/release/bundle/nsis/cc-bridge_<版本>_x64-setup.exe(v2.4.0 为 4.48MB)
macOS:
cd desktop
npm install
npm run prebuild
npx tauri build --bundles app # 必须用 --bundles 覆盖
产出路径:src-tauri/target/release/bundle/macos/cc-bridge.app(以及 updater 用的cc-bridge.app.tar.gz + .sig)。
为何 mac 必须带
--bundles:tauri.conf.json的bundle.targets固定为nsis
(Windows 发版路径),不覆盖的话 mac 上会直接失败。故意不往配置里加 mac target,
避开影响已稳定的 Windows 发版。若要产出可分发的 zip,用
ditto而不是zip:ditto -c -k --sequesterRsrc --keepParent <path>/cc-bridge.app out.zip。
普通zip会破坏.app的资源叉与符号链接,解压后打不开。
接入 AI 工具
安装并启动 cc-bridge 后,连接页的接入向导会按你选的工具生成配置片段(Claude Code / WorkBuddy / Codex / 通用 MCP 四选一),HTTPS 开启时自动切 https:// 并附「复制 PEM」步骤。
模式 A(内网,Claude Code)——在远程 Linux 执行面板给出的命令:
claude mcp add --transport http cc-bridge http://<局域网IP>:7823/mcp --header "Authorization: Bearer <token>"
模式 B(跨公网,HTTPS)——连接页选工具复制片段;Claude Code 需先信任自签证书:
# 1. 从向导「复制 PEM」保存证书,随后在远程/本地 shell 导出信任变量
export NODE_EXTRA_CA_CERTS=/path/to/cc-bridge.crt
# 2. 面板给出的命令(URL 已是 https)
claude mcp add --transport http cc-bridge https://<IP或域名>:7823/mcp --header "Authorization: Bearer <token>"
其他工具(Codex = TOML、WorkBuddy = JSON)的完整片段与各工具自签信任路径,见 兼容性矩阵。
macOS 安装与更新说明
本节结论均来自 CI 在真实 macOS(arm64)上的实测,不是推测。
适用范围:仅 Apple Silicon(arm64)。包用 ad-hoc 签名,未购买 Apple Developer
账号、未做公证(notarize)——这是内网自用的取舍。
安装
推荐路径:内网直接拷贝。通过共享目录 / U 盘 / scp 拿到 cc-bridge.app 的,
通常不带隔离属性,双击就能开,没有下面那些麻烦。
经浏览器 / 网盘下载的,macOS 会给它打上 com.apple.quarantine 隔离属性,
首次打开会被 Gatekeeper 拦住(实测:带隔离属性时应用起不来,服务端口无响应)。
两种解法:
# 方式一(推荐,一次性):直接清除隔离属性
xattr -dr com.apple.quarantine /你的路径/cc-bridge.app
方式二(图形界面):双击 → 被拦 → 系统设置 → 隐私与安全性 → 下拉找到提示 → 点「仍要打开」。
⚠️ macOS 15 (Sequoia) 起,老套路「右键 → 打开」已经失效,必须走系统设置那条。
如果你用
spctl -a -vvv自己查过并看到rejected,不用在意:spctl判的是
「能不能过公证策略」,ad-hoc 包永远过不了;而 Gatekeeper 实际只拦带隔离属性的包。
实测:清掉隔离属性后应用正常启动,尽管spctl仍报 rejected。
装到哪里
| 位置 | 自动更新体验 |
|---|---|
~/Applications/(用户级) |
✅ 推荐 —— 全程无感 |
/Applications/(系统级) |
⚠️ 能用,但每次更新都会弹系统管理员密码框(updater 需提权才能写入) |
| 外置盘 / 其他磁盘卷 | ❌ 不要放——自动更新会失败 |
最后一条的原因:updater 先用
rename把旧包移到临时目录(在/var/folders),
而rename跨文件系统会返回EXDEV而不是「权限不足」——于是它不会尝试提权,
直接失败。这一条是读 源码 发现的,尚未实测(CI 里同卷、碰不到)。
自动更新
可用。完整链路(检查 → 下载 → 验签 → 替换 .app → 重启)已在真实 macOS 上跑通。
一个常见担心可以打消:更新后不会再被 Gatekeeper 拦。因为 updater 是用程序直接
解压并替换文件的,不经浏览器那条路,新包不会被打上隔离属性(实测确认:
更新后的包 xattr 为空、签名校验通过、重启后服务正常)。所以你只需要在首次安装时
放行一次,之后的更新都是无感的。
已知差异(与 Windows 版相比)
Cmd+W关不了窗:窗口是自绘标题栏,没有系统关闭按钮,而Cmd+W依赖的正是它。
用标题栏里的关闭按钮(正常)或托盘菜单。Cmd+Q退出正常。- 防火墙相关功能不可用:这些靠 Windows 的
netsh,界面上已自动隐藏。 - IP 变化提示不实时:mac 上靠 5 秒轮询兜底(功能正常,只是不是瞬时的)。
- 命令执行壳层为
sh/bash(Windows 是cmd/ Git Bash)。 - 设置页没有「桌面快捷方式」这一行:它靠 Windows 的
.lnk+powershell实现,
mac 上没这回事。入口用 Dock / 启动台(把cc-bridge.app拖进 Dock 即可)。 - 「安装位置」显示的是
cc-bridge.app本体(而不是包内的Contents/MacOS),
「打开目录」会在访达里选中它。 - 桌面通知尚未在真机确认:mac 侧走
NSUserNotification,若系统设置的「通知」
里没放行 cc-bridge,通知会静默不弹。现已把失败写进日志(日志页可见),push_notification也会回传pushed: false,让远程 AI 改用文字告知你。
配置迁移
首次启动时,如果检测到旧版 config.json 文件存在:
- 自动将配置项导入 SQLite
- 旧文件重命名为
config.json.migrated
已知限制
- 平台:仅 Windows 10/11 与 macOS(Apple Silicon);没有 Intel Mac(x86_64)和 Linux 构建。mac 版的差异见 已知差异。
- 跨公网访问只有两种受支持的形态:内置 HTTPS 自签(无域名)或反向代理 + Let's Encrypt(有域名,见 reverse-proxy.md)。桥本身不做内网穿透、不开裸 HTTP 公网暴露;自签证书对部分 AI 工具的兼容性以 实测矩阵 为准。
analyze_file的函数/类计数是正则启发式估算,不是语法解析。- 亮色主题 × Claude Code 主题跟随:终端会在数据流里代答 OSC 10/11 颜色查询,Claude Code 的
theme: auto能正确跟随桥的亮/暗主题(亮色下用户消息不再是黑块);过旧的 Claude Code 版本无 auto 模式,需在会话里手动/theme light。详见 兼容性矩阵。 delete_files只删单个文件,不支持删目录(安全设计)。- MCP 协议实现为手动 JSON-RPC dispatch(非 rmcp SDK 宏),不做协议协商。
run_command的跨调用 shell 会话持久化(拿sessionId带住cwd+ 环境变量)默认关闭,不开时必须每次显式传绝对cwd。get_command_output/wait_command用outputComplete区分「进程已退出」与「管道已读完」(exit ≠ close)——前者为 false 时尾部可能还会长,别当最终结果。- 后台命令(
run_command(background=true))注册表由周期任务按command_cleanup_secs(默认 120s)自动回收;stop_command只打终止标记、不删条目,被杀进程的输出在宽容期内仍可取回。kill 未生效的顽固进程也会在宽容期后被清理(否则永久占用并发名额)。 run_command前台模式超时后仍会强杀命令(不会自动转后台继续跑);但超时前已产生的输出会连同timedOut: true一起返回(默认超时 120s)。长任务请用background: true。- SSH 终端是本地人操作的交互终端(第 4 个 Tab),不是给远程 AI 工具的 MCP 工具,远端无法用它;它需要本机装有 OpenSSH 客户端(Windows 10/11 / macOS 均自带,极少数精简镜像需
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0安装)。
版本历史
| 版本 | 变更 |
|---|---|
| v3.1.1 | 工具调用守住客户端时限、输出瘦身,中文乱码与 cmd 引号修复;对话侧补无障碍播报、流式光标、长会话窗口化 |
| v3.1.0 | 对话工作区全面升级(多会话分屏 / Markdown / @引用 / 审批直接看 diff),终端与 MCP 一批稳定性修复 |
| v3.0.0 | 一体化外壳与终端分屏,新增文件直传/图片查看/后台等待工具,自动更新不再空等 |
| v2.10.0 | v2.10.0 版本更新 |
| v2.9.1 | v2.9.1 版本更新 |
| v2.9.0 | v2.9.0 版本更新 |
| v2.8.1 | v2.8.1 版本更新 |
| v2.8.0 | 连接页评审修复批次:新用户接入步骤自动展开、多网卡地址本机连通探测、接入向导扩展到四类工具(通用可复制提示词给 AI 代接入)、HTTPS 自签远程访问;终端 TUI 虚拟滚动/命令导航/配色跟随;设置页任务重排、日志页全键盘操作、统一通知系统。 |
| v2.7.7 | 首页新增「Token 用量」卡(今日估算 + 调用次数 + 近 7 天柱状图);设置页新增用量仪表盘——KPI 环比、14 天趋势、90 天热力图、按工具排行,点首页卡片直达;估算值口径,非账单。 |
| v2.7.6 | 终端底部多了一条状态栏(当前目录 / 退出码 / git 分支,4 套预设);粘贴多行不再弹框——内容整块进命令行、显示成多行,按回车才执行;拖文件到终端直接落到远端当前目录,不再每次问;设置页加了左侧导航。 |
| v2.7.5 | 检查更新和下载更新包现在走同一个镜像了。之前读更新信息用的是新地址,实际下载却还走那个证书过期过的旧镜像——两边不统一时,可能出现「提示有新版本,却怎么也下不下来」。 |
| v2.7.4 | 终端里的中文不再随机烂字(以前每约 4KB 就烂一个);刷大量输出时不再把界面卡死;同一台机器现在可以开多个终端,一边 tail -f 一边敲命令;重连不再清空之前的输出。 |
| v2.7.3 | v2.7.3 版本更新 |
| v2.7.2 | v2.7.2 版本更新 |
| v2.7.1 | SSH 终端现在能粘贴了(Ctrl+V / 右键 / 工具栏);文件传输加上了进度条和取消按钮,覆盖前会先问一句;并修复了带空格的文件名传不了的问题。 |
| v2.7.0 | v2.7.0 版本更新 |
| v2.6.4 | v2.6.4 版本更新 |
| v2.6.3 | 上版换行修复的收尾:成功的编辑不再顶着一句“可能匹配失败”的矛盾提醒;内部补上真正走完整链路的回归测试(旧那条把修复改回去也不会变红),并把行尾归一化规则统一到一处 |
| v2.6.2 | 修复编辑 Windows 换行(CRLF)文件时莫名报「找不到要替换的内容」(内容就在那里,只是行尾表示对不上);同时修掉一条会把人往编码问题上引的错误诊断。写入行为未变:CRLF 文件改完仍是 CRLF |
| v2.6.1 | 修复 mac 版发不出来(v2.6.0 的 mac 构建失败,Windows 不受影响)。新增:导入外挂 MCP 工具时可以「运行一下」,就地看到它提供哪些工具(名字 + 一句话);设置页服务行与启用前的风险确认框也会列出同一份清单,跑一次即可 |
| v2.6.0 | 外挂 MCP 桥:把本机已装的任意 MCP 工具(代码索引、文档检索等)转给远程 Claude Code 用。可从 Claude Code / Cursor / Claude Desktop 的现有配置一键导入,逐个启用(总开关默认关、启用前弹风险确认并逐字列出它要启动的命令);支持多个项目(远程可按调用指定工作目录,需单独开启)。协议层通用,新接一个工具不需要改代码。另修掉国内加速镜像失败时静默报成功(已影响近四个版本的国内下载与更新) |
| v2.5.0 | 连接页整页改版:服务状态改为链路展示(本机服务 → 防火墙 → 远程调用,能告诉你卡在哪一环),新增四张带趋势小图的指标卡与健康度 / 安全治理卡,各卡可点直达对应设置,并补齐了一批微动画。另修掉 macOS 最小化到 Dock 后后台刷新不停、以及后台命令很长时撑破窗口两个问题 |
| v2.4.2 | macOS 专项修复:修掉 mac 上 CPU 长期占满一个核心(mac 版自首发即存在;本机地址监听任务空转且每轮枚举网卡),并恢复 mac 上地址变化的托盘提示与桌面通知;Windows 不受影响。内部:commands.rs 拆分完成(2700 行 → 9 个子模块 + 48 行聚合,四批增量,新增 tools/fingerprint.py 做纯搬动等价性校验) |
| v2.4.1 | 白名单可按项目存多套目录并一键切换;备份可在面板里手动清理(按时间/体积、删前预览、默认保底留最近一份);设置页重排为十张主题卡且设置项可搜;修复「删除早于 N 天」误删备份、「关窗时释放界面内存」未生效、托盘左键弹右键菜单;统一应用名与 macOS 图标 |
| v2.4.0 | 新增 macOS(Apple Silicon)支持:可安装、可自动更新,功能与 Windows 版一致(防火墙相关功能除外);界面文案与可用功能按平台适配;修正 mac 上「打开备份目录」与「安装位置」;危险命令拦截补上 mac 三类毁灭性目标 |
| v2.3.20 | 修复长期占满一个 CPU 核心的后台线程(并让「IP 变化提示」恢复生效);窗口收进托盘后暂停全部轮询与常驻动画;数据库日志文件从 4MB 收到 0;命令超时不再丢弃已产出输出且默认超时放宽到 2 分钟;修复三个此前传了不生效的工具参数 |
| v2.3.19 | 新增 Windows 防火墙一键放行;命令拦截升级为语法感知分析;日志分页内滚、连接页纯 CSS 动态表达 |
| v2.3.18 | v2.3.18 版本更新 |
| v2.3.17 | v2.3.17 版本更新 |
| v2.3.16 | 新增桌面通知能力(AI 主动提醒 + 后台命令完成自动通知)与命令安全策略;补充前端单测 |
| v2.3.15 | v2.3.15 版本更新 |
| v2.3.14 | v2.3.14 版本更新 |
| v2.3.13 | 修掉发布版执行命令弹黑框 + 后台命令与关于卡片体验优化:执行 cmd/bash 命令不再弹黑色控制台窗口;没有新更新时关于卡片不再自动展开;后台命令列表整行可点即可查看输出;write_files 覆盖文件自动保留原编码(中文文件不再被静默转码) |
| v2.3.12 | 构建修复:修复 v2.3.11 CI 构建中 tauri 命令找不到导致安装包未能生成的问题(发版前同步 package.json 版本号、预构建脚本与主构建流程分离);用户侧内容与 v2.3.11 一致(红点引导 + 接入模式折叠 + 更新弹框分流 + 托盘闪烁修复等) |
| v2.3.11 | 设置红点引导 + 接入模式折叠 + 更新弹框分流 + 托盘闪烁修复:设置页红点不再每次打开都乱亮,且能点击引导展开「更新历史」、看完才标已读;自动检查更新不再弹「已是最新」框,仅手动点「检查更新」才提示;连接页「接入模式」收进手风琴折叠区、首次接入默认全展开引导;IP 变化给出 banner 与倒计时;修掉托盘图标闪烁 |
| v2.3.10 | 托盘复制 IP 命令跟随作用域 + 切换联动修复:托盘右键「复制 IP 命令」现在与连接页选的作用域一致——选「项目级」复制针对项目 .mcp.json 的命令(设了项目路径时自动带 cd 前缀),选「全局模式」复制针对用户级 ~/.claude.json 的命令,与连接页「连接命令」逐字对应;修掉切换作用域后托盘命令不跟着变的遗留问题 |
| v2.3.9 | 新手引导修复 + 后端健壮性加固 + MCP 工具三项增强:设置页新增「重新查看使用引导」入口、修复新手引导交互缺陷;全量审计后一批后端健壮性修复(非法正则/异常 ipynb 不再 panic、备份保留数为 0 不再误删、配置写入事务回滚等);edit_files 在 old_string 多带首尾空白时主动提醒;read_files 加固二进制识别(PNG/EXE 经 GBK 回退误判为文本的洞补上);search_files 命中过多时明确告知结果已截断 |
| v2.3.8 | SSE 流式传输 + 连接页手风琴重构 + bash 探测兜底:设置页一键切换 HTTP/SSE 传输,连接命令与托盘复制自动联动,切 SSE 时弹现成远端迁移命令;连接页改为手风琴(首次自动展开、之后收起、一次只开一个、自动滚动 + 平滑动画);版本历史弹框支持一键全屏、长内容自动换行;修复 bash 探测误报与日志搜索框聚焦内边框;移除传输安全常驻提醒 |
| v2.3.7 | 性能提速 + 导入配置修复 + 更新弹框升级路径:审计日志/白名单/网卡枚举加缓存(空闲近乎零开销);日志页渲染隔离更跟手;修复导入配置后新目录未立即生效;更新弹框清晰展示「当前版本 → 新版本」 |
| v2.3.6 | bash 壳层切换 + 托盘复制修复 + 二进制防乱码 + 托盘 IP 替换:设置页新增 cmd/bash 命令壳层切换(bash 带远端感知+不可用前端拦截);托盘「复制连接命令」改为系统级剪贴板+通知(不再因窗口隐藏失败);read_files 新增二进制守卫防止 PNG/EXE 被误判为文本返回乱码;托盘新增「复制 IP 替换命令」项(sed 命令,一键复制);edit_files 匹配失败时检测首尾多余空白并给出提示 |
| v2.3.4 | 动画质感升级 + 更新交互优化 + 窄屏竖排修复:引入轻量动画库(gzip ~3.5KB,不碰体积红线)并抽离统一弹窗原语,5 处弹窗关闭带退场动画(不再硬消失);Tab 切换交叉淡入;白名单/审计表增删重排 FLIP 动画;按钮水波纹、Toast 退场、Hero 数字 count-up;全局「减弱动效」自动降级(无障碍友好);更新交互优化——点「稍后」后本版本不再自动弹框(按版本号记忆);修复窄屏下网络设置按钮文字竖排 |
| v2.3.3 | UI 设计语言统一收尾 + 微交互/分隔线润色 + P0/P1 安全加固落地:全局过渡与按压反馈统一(.interactive 语义类 + Spinner 组件 + 按钮 active:scale);分隔线抽离 .divider-x/-y 语义类收口 9 处;空状态仅保留日志/命令面板引导式占位(白名单为空与后台命令无记录恢复 P2 前交互);随本次发布落地 P0/P1 编码探测一致、路径穿越显式拒绝、常量时间鉴权、后台任务 panic 自愈、传输安全提醒,以及备份还原/更新进度/复制反馈等修复与统一确认弹窗 ConfirmDialog、剪贴板 copyText()、诊断报告导出等 |
| v2.3.2 | Gitee 镜像优先 + 自动回退 + 下载速度 + uptodate 静默修复:自动更新支持 Gitee 镜像优先 + 客户端多候选源自动回退(Gitee→ghproxy→GitHub),解决国内直连 GitHub 下载不稳/慢;下载进度新增速度显示(MB/s);修复更新下载进度条恒显 0%、点击检查更新后无提示无报错的静默 bug;overheadMs 真实计算;MCP 重启逻辑收拢;版本历史弹框还原/查看按钮白名单深层路径定位修复 |
| v2.3.1 | netsh 异常温和提示 + 备份浏览器 + IP 弹窗作用域联动 + 打开目录不闪窗:防火墙 netsh 损坏时启动探测并改为连接页温和提示(不再弹系统错误框);新增备份浏览器(版本历史弹框,时间线 + 相邻版对比 + 还原);IP 变化弹窗作用域跟随连接页「项目级/全局模式」选择卡实时联动;打开安装目录改用 reveal_item_in_dir(不闪 cmd 窗口);安全页图标统一为单色风格 |
| v2.3.0 | 运行卡双栏布局 + 防火墙落地 + 安装与快捷方式 + 更新展示增强:运行卡重排为双栏布局(高度 ~375→275px)、停止按钮质感优化、数据雨负载联动;防火墙 netsh 规则级查询 + UAC 提权开放端口(ConnectTab 告警块一键开放);设置页新增「安装与快捷方式」卡片(查看安装目录 + 桌面快捷方式重建);更新下载进度条可视化(Header 进度环 + 关于胶囊);更新内容展示增强(徽章可点开 + 关于内联 + UpdateNotesDialog);累积性能优化与 UI 体验增强;修复安装目录打开不弹窗、桌面快捷方式创建失败等若干问题 |
| v2.2.23 | MCP 分发层重构 + over-the-wire 测试 + 连接页方案 A:手写 dispatch 改为工具注册表 + ToolSchema 派生宏(17 工具 inputSchema 自动派生,新增工具零样板);新增真实起 server+reqwest 的端到端集成测试(10 用例,覆盖协议握手/17 工具分发与副作用/鉴权/限流/gzip/错误码,72→82 全绿、clippy 零警告);修复 notebook_edit 驼峰 newSource 被静默忽略的序列化缺陷;连接页方案 A 落地(Token 内嵌 + 分区 + 渐变徽章步骤 + 灰底命令框);关于页更新历史从 CHANGELOG.md 自动生成 |
| v2.2.22 | PastePanda 风格 UI 全面升级:关于卡片折叠模式+分类标签更新历史、Header 版本号改为可点击 7态 UpdateBadge、托盘图标升级为真实图标+状态圆点叠加、扩展名改为分类按钮芯片输入(34个常用)、文件管控 PastePanda 行式布局、网络卡片紧凑化、软件名 6 处统一从 APP_INFO.name 取值、config.rs serde 编译修复 |
| v2.2.21 | P0 系列落地 + IP 变化检测修复 + Header 安全徽章精准跳转:回退 P0-2 警示条,Header 安全徽章改为点击跳转设置页「功能开关」卡并平滑滚动到对应行 + 脉冲高亮(白名单/只读/命令执行三个开关精准定位);P0-3 LogTab 原生 <select> 替换为自研 Combobox(触发器 + 浮层 + 选中勾 + 点击外部/Esc 关闭);P0-4 新增全局 ErrorBoundary;IP 变化检测补「指定具体 host 且该地址已失效」分支(O4),build_connect_command 优先用用户已选 IP(P1) 并由调用方传入 lan_ips 避免重复枚举网卡(P3);LogTab DetailPanel 新增 O1 五维耗时拆解渲染 |
| v2.2.19 | search_files 追平 native Claude Code 第三步(P6-3):内容搜索内核从逐行 BufReader.lines()+regex 换成 grep-searcher(ripgrep 同款引擎)——内存映射 + SIMD 行扫描 + 字面量预筛,大文件内容搜索提速 2–5x;自动二进制检测(含 NUL 文件跳过,对齐 native Grep --text 默认关);Lossy 解码修复 GBK 老工程源码被漏搜 的隐藏 bug。仅引入 grep-searcher+grep-regex(不引 grep-cli,控制体积) |
| v2.2.18 | search_files 追平 native Claude Code 第二步(P6-2):强制排除名单补 .svn/.hg/.bzr 三类 VCS 元数据目录(对齐 ripgrep 默认 VCS 名单),老 SVN/Hg 工程里成千上万的 .svn-base 等文件不再被整盘扫入;文件名(Glob 类)搜索结果改为按修改时间倒序(最近修改优先,对齐 native Glob 相关性)。前置 P6-1 已完成并行遍历 + 强制排除 target/node_modules/.git |
| v2.2.2 | 本机地址变更检测:记住上次确认使用的 IP(last_selected_ip),一旦不在当前网卡地址列表中(VPN 重连等)就主动提示——顶栏红色徽章 + Connect 页醒目 banner(一键复制新连接命令并重新确认)+ 系统托盘 tooltip/原生通知(应用最小化时也能发现),三处随确认同步消失。/health 版本号改为编译期读取 CARGO_PKG_VERSION,不再手写字符串避免漂移 |
| v2.2.1 | 编码/换行保真加固(参考 nc-compile/ccedit.py):read_files 整读/行读统一归一化到 LF 并回报 newline(CRLF/LF),修复 CRLF 文件 edit_files 匹配失败的问题;edit_files 写回保留原换行 + 原 UTF-8 BOM、encode→decode round-trip 守卫(往 GBK 插入不可表示字符时拒写防损坏)、原子写(临时文件 + rename)。新增「读取编码自适应」功能开关(默认关,按 UTF-8 读避免误判;开启后自动识别 GBK/GB18030;显式 encoding 参数始终优先,不受开关影响) |
| v2.2.0 | 能力对齐 native Claude Code 文件层:新增 edit_files(精准字符串替换,唯一匹配/replaceAll,保留原文件编码)、create_directory、remove_directory 三个工具(9 → 12);read_files 编码自适应(自动探测 UTF-8/GBK/GB18030/UTF-16 统一转 UTF-8,可 encoding 强制指定),解决 GBK(如 NC65)源码读不了的问题;三个写工具纳入只读模式门控;引入 encoding_rs |
| v2.1.0 | 界面美化升级(靛蓝主色、Hero 玻璃指标卡、segmented pill Tab、图标 chip);新增 MCP 服务停止/启动按钮(顶栏 + Hero 卡,UI 联动置灰);设置页「功能开关」卡:路径白名单校验 / 只读模式 / 审计日志 / 写操作自动备份 / 限流保护(关闭白名单需二次确认 + 常驻警示条 + 顶栏徽章);连接页 IP/模式选中态强化 + 项目级默认 + health 命令复制;日志页清空日志;白名单显示去除 \\?\ 前缀 |
| v2.0.0 | 纯 Rust 重写,去掉 Node.js sidecar(88MB → 14MB),安装包 25MB → 3.4MB;shadcn/ui 风格 4-Tab 界面(连接/安全/设置/日志);MCP scope 选择、开机自启、审计日志保留策略、安全项即时保存 |
| v1.0.0 | Node.js SEA + Tauri sidecar 方案 |
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi



