cc-bridge

mcp
Security Audit
Fail
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Fail
  • 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 Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

把桥装在文件所在的那台机器上,让 Claude Code / Codex 从任何地方接入:云主机上跑 AI,直接改你本机 Windows/macOS 的代码——代码不出本机、不用 scp、不用 SSHFS。白名单 + 审计日志 + 自动备份 + 内置 HTTPS 自签。4.5MB 桌面应用。

README.md

cc-bridge — 把桥装在文件所在的地方,让 AI 从任何地方接入

最新版本
开源协议
Star 数
下载量

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 上。原来的痛点:

  1. 文件传输效率低:每次改动都要 scp,大文件慢,容易版本混乱。
  2. SSHFS 不稳定:网络一断挂载点卡死,终端被阻塞。
  3. 缺少智能化操作:只能终端命令操作文件,没有批量重构、代码分析能力。
  4. 操作无法审计:不知道 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

第一种具体是这样跑起来的(五步,都在一分钟内):

  1. 文件所在的本机装 cc-bridge(4.5MB,双击装完即启动);
  2. 连接页给出 MCP 端点和 Bearer 令牌,在云主机的 Claude Code 里加一条 MCP 配置(内网直连,或走内置 HTTPS 自签);
  3. 之后你在 CC 里说「读一下 src/app.tsx」「把这三处改掉」,这些工具调用落在你本机——代码从来没有上传到云上,编辑器里能立刻看到改动;
  4. 每次写入都有审计记录与自动备份,改错了可以按组还原;
  5. 白名单以外一律拒绝,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)

  1. 切到「连接」页,复制给出的 claude mcp add ... 命令。
  2. 粘贴到远程 Linux 终端执行,Claude Code 立刻就能读写你本机的文件了。

仅建议在同一内网 / VPN 下使用,不要暴露到公网(详见文末「已知限制」)。

模式 B:本地 AI → 接入远程机器的文件(跨公网)

  1. 在 cc-bridge 的「设置 › 安全 › HTTPS 远程访问」一键开启 HTTPS:自动生成自签证书(绑定本机网卡 IP),显示 SHA-256 指纹。
  2. 在装桥那台机器的面板「连接」页选你的 AI 工具,复制对应的配置片段(URL 已自动切 https://);再把 URL 与 token 抄进你本地 AI 工具的配置里。
  3. 核对指纹:把设置页显示的证书指纹与你本地记录的比对一致后再连,防中间人。
  4. 接入方式按工具不同——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-sys 0.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 干扰。
  • 交互:xterm.js 渲染,TERM=xterm-256color + 中文 UTF-8;窗口缩放走 PTY resize;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 方案

Reviews (0)

No results found