Skip to content

xiaoliu10/remote-code

Repository files navigation

Remote Code

English | 简体中文

🤖 本项目 100% 由 AI (Claude Code) 编写完成

基于 Go + Vue 3 的远程终端管理工具,可以远程监控和控制 CLI 编程工具。

支持的 CLI 工具

Remote Code 可以帮助你远程管理和控制各种 AI 编程助手和终端工具:

  • Claude Code: Anthropic 官方的 AI 编程助手 CLI,提供智能代码生成、重构和调试功能
  • Aider: 开源的 AI 结对编程工具,支持 GPT-4 和 Claude 等模型
  • Open Code: 基于 OpenAI API 的代码助手,提供代码生成和优化建议
  • Qwen Code: 阿里通义千问的代码助手,支持中文和多语言编程
  • Continue: 开源的 AI 编程助手,支持多种大语言模型
  • 其他 CLI 工具: 任何基于终端的命令行工具(如 vim、htop、irssi 等)都可以通过 Remote Code 远程管理

为什么选择 Remote Code?

当你在本地运行这些 AI 编程工具时,可能会遇到以下场景:

  • 需要在移动设备上远程查看和控制编程会话
  • 想在外出时继续家中电脑上的编程任务
  • 需要随时随地访问和管理多个编程会话
  • 希望在手机或平板上也能使用 AI 编程助手

Remote Code 通过 Web 界面和内网穿透技术,让你可以随时随地远程访问和控制这些 CLI 工具,提供流畅的移动端体验和实时终端交互。

功能特性

  • 🔐 安全认证: JWT Token 认证 + bcrypt 密码加密
  • 🎨 精美界面: 玻璃拟态风格登录页,现代化 UI 设计
  • 🖥️ 会话管理: 创建、删除、查看终端会话,支持会话持久化
  • 📡 实时终端: WebSocket 实时流式传输终端输出
  • 📜 终端滚动: 支持 tmux copy mode 滚动,可查看 5000 行历史记录,带可视化滚动条
  • 📋 终端复制: 支持选择模式复制终端内容,桌面端和移动端均可使用
  • ⌨️ 远程控制: 发送命令到远程会话,支持实时模式和命令模式
  • ⌨️ 快捷键: 支持 Ctrl+B 快捷键
  • 📱 移动端优化: 自定义虚拟键盘,包含方向键、Tab、Ctrl+C、Enter、滚动模式等快捷键,支持长按连发
  • 🎤 语音输入: 支持语音输入命令(需要 HTTPS)
  • 📂 文件浏览: 内置文件浏览器,支持浏览、查看文件内容
  • 🔒 文件引用: 支持 @ 符号触发文件引用功能
  • 🛡️ 安全防护: 速率限制、输入验证、路径白名单
  • 📦 跨平台编译: 支持编译为独立可执行文件,无需 Go 环境
  • 🌐 内网穿透: 集成多种内网穿透方案(Frp、Tailscale、Cloudflare Tunnel)
  • 🌍 国际化: 支持中英文切换
  • 📜 开源协议: Apache License 2.0

最近更新

完整变更记录请查看 CHANGELOG.md

v0.0.6 - 移动端体验优化

新功能

  • ✨ 虚拟键盘新增"清空"按钮,一键清除输入框内容

问题修复

  • 🐛 修复移动端按钮双击触发页面缩放的问题

v0.0.5 - 移动端体验优化

新功能

  • ✨ 新增终端选择模式,支持复制终端内容(桌面端和移动端均可使用)
  • ✨ 虚拟键盘新增 Shift+Tab 按钮,用于切换 Claude Code 编码模式

优化改进

  • 🎯 方向键(↑↓←→)支持长按连发,移动端操作更流畅
  • 🎯 退格键(⌫)支持长按连发
  • 🎯 简化终端头部工具栏,移除滚动控制按钮

v0.0.4 - 终端复制功能

新功能

  • ✨ 添加终端选择模式,支持选择并复制终端内容
  • ✨ 支持全选、清除选择、复制选中内容

v0.0.3 - FAQ 与问题修复

新功能

优化改进

  • 🎯 修复会话持久化问题
  • 🎯 修复语音输入焦点问题
  • 🎯 每个会话现在连接到独立的 tmux 会话
  • 🎯 所有平台统一使用 Ctrl+B 作为 tmux 快捷键

技术栈

后端

  • Go 1.21+
  • Gin Web 框架
  • gorilla/websocket
  • JWT 认证
  • tmux 会话管理

前端

  • Vue 3 + TypeScript
  • Vite
  • Naive UI
  • xterm.js
  • Pinia
  • Vue Router

快速开始

前置要求

  • Go 1.21+(仅源码运行需要,使用编译版本不需要)
  • Node.js 20+(前端开发需要)
  • tmux

方式一:源码运行

# 1. 克隆项目
git clone https://github.com/xiaoliu10/remote-code.git
cd remote-code

# 2. 启动服务(首次启动会自动创建配置)
./start.sh

# 访问 http://localhost:5173

方式二:编译后运行(推荐生产环境)

# 1. 克隆项目
git clone https://github.com/xiaoliu10/remote-code.git
cd remote-code

# 2. 编译后端(生成多平台可执行文件)
./build.sh

# 3. 启动服务(会自动使用编译好的二进制)
./start.sh --frp

# 访问 http://localhost:5173

编译输出:

平台 文件名 架构
macOS Intel remote-code-macos-intel x86_64
macOS Apple Silicon remote-code-macos-apple arm64
Linux x64 remote-code-linux-x64 x86_64
Linux ARM64 remote-code-linux-arm64 arm64
Windows x64 remote-code-windows-x64.exe x86_64

首次启动时,系统会自动:

  • ~/.remote-code/ 创建配置目录
  • 生成随机管理员密码(请保存!)
  • 启动后端服务(端口 9090)
  • 启动前端服务(端口 5173)

管理命令

./build.sh          # 编译多平台可执行文件
./start.sh          # 启动服务
./start.sh --frp    # 启动服务并启用 FRP
./start.sh --no-frp # 启动服务(禁用 FRP)
./stop.sh           # 停止服务

配置文件

配置文件位于 ~/.remote-code/config.ini

# 后端配置
BACKEND_PORT=9090
JWT_SECRET=auto-generated
ADMIN_PASSWORD=auto-generated
ALLOWED_DIR=/home/user/projects

# FRP 配置
FRP_ENABLED=false
FRP_SERVER_ADDR=your-server-ip
FRP_SERVER_PORT=7000
FRP_TOKEN=your-token

远程访问

为什么需要内网穿透?

Remote Code 默认运行在本地网络中,只能在局域网内访问。当你需要在外网(如公司、咖啡厅、移动网络)远程访问家中的 Claude Code 会话时,就需要内网穿透。

适用场景:

  • 家中电脑运行 Claude Code,外出时需要远程控制
  • 公司网络无法暴露端口到公网
  • 没有公网 IP 或运营商封锁了端口
  • 需要稳定的远程访问体验

方式一:FRP + Nginx HTTPS(推荐)

FRP (Fast Reverse Proxy) 是一个高性能的内网穿透工具,通过公网服务器将本地服务暴露到外网。

1. 配置 FRP

编辑 ~/.remote-code/config.ini

FRP_ENABLED=true
FRP_SERVER_ADDR=your-server-ip
FRP_SERVER_PORT=7000
FRP_TOKEN=your-token

2. 服务器端配置 Nginx

在服务器上创建 Nginx 配置:

server {
    listen 8444 ssl http2;
    server_name your-domain.com;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # WebSocket
    location /api/ws {
        proxy_pass http://127.0.0.1:9090;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400s;
    }

    # 后端 API
    location /api {
        proxy_pass http://127.0.0.1:9090;
        proxy_set_header Host $host;
    }

    # 前端
    location / {
        proxy_pass http://127.0.0.1:5173;
        proxy_set_header Host $host;
    }
}

3. 启动服务

./start.sh --frp

4. 访问

https://your-domain.com:8444

方式二:Tailscale

# 安装并登录 Tailscale
brew install tailscale
sudo tailscale up

# 启动服务
./start.sh

# 访问 http://<tailscale-ip>:5173

方式三:Cloudflare Tunnel

export CLOUDFLARE_TUNNEL_TOKEN=your-token
docker-compose --profile cloudflare up -d

使用说明

1. 登录系统

首次启动时会生成随机密码,查看启动输出获取密码。

2. 创建会话

  1. 输入会话名称(如: my-project
  2. 选择工作目录(可选)
  3. 点击 "Create" 创建会话

3. 终端使用

终端支持两种输入模式:

  • 实时模式: 每个字符实时发送,支持自动补全
  • 命令模式: 按 Enter 发送完整命令

滚动模式

  • 点击虚拟键盘上的滚动按钮或按 Ctrl+B (Mac: ⌘+B) 进入滚动模式
  • 使用鼠标滚轮或滚动条查看历史输出(最多 5000 行)
  • q 或再次点击滚动按钮退出滚动模式

复制终端内容

  • 点击工具栏上的 复制图标 进入选择模式
  • 在弹出的窗口中,点击行选择要复制的内容
    • 桌面端:Shift+点击可快速选择范围
    • 移动端:逐行点击选择多行
  • 点击 "全选" 按钮选择所有内容
  • 点击 "复制选中" 按钮复制选中的内容
  • 点击 "关闭" 退出选择模式

移动端虚拟键盘:

  • 方向键(上下左右),支持长按连发
  • Tab、Shift+Tab(切换编码模式)
  • Ctrl+C、Ctrl+L
  • 📜 滚动模式切换
  • @ 符号(文件引用)
  • 🎤 语音输入(长按说话)

4. 语音输入

⚠️ 语音输入需要 HTTPS

语音输入功能由于浏览器安全限制,需要满足以下条件之一:

方式 说明
HTTPS 使用 Nginx + Let's Encrypt
localhost 本地访问无需配置
Chrome 标志 仅测试用,访问 chrome://flags/#unsafely-treat-insecure-origin-as-secure

语音输入有两种模式:

  1. 实时模式(默认):语音识别结果实时发送到终端,类似手动输入字符
  2. 命令模式:语音识别结果填入命令输入框,修改后再发送

使用方法:

  1. 点击输入框旁边的 ⚡ 闪电按钮 切换模式:

    • 蓝色高亮 = 实时模式
    • 灰色 = 命令模式
  2. 语音输入方式

    • 长按 🎤 麦克风按钮开始语音输入
    • 说话完成后 松开 按钮,识别结果会自动处理
    • 最大录音时长 30 秒
  3. 命令模式使用流程(推荐):

    • 确认闪电按钮为灰色(命令模式)
    • 长按 🎤 麦克风按钮开始语音输入
    • 说话完成后松开按钮,识别结果会自动填入命令输入框
    • 输入框会自动获得焦点,方便你修改识别不准确的文字
    • 确认无误后点击 "发送" 按钮或按 Enter 发送

适用场景:

  • 命令模式适合需要修改识别结果后再发送的场景
  • 实时模式适合快速输入简单命令

5. 文件浏览

点击侧边栏的文件图标,浏览工作目录中的文件。

目录结构

~/.remote-code/          # 配置目录
├── config.ini                  # 主配置文件
├── frpc.ini                    # FRP 配置(自动生成)
├── frpc                        # FRP 客户端(自动下载)
└── logs/                       # 日志目录
    ├── backend.log
    ├── frontend.log
    └── frp.log

remote-code/             # 源码目录
├── backend/                    # Go 后端
├── frontend/                   # Vue 前端
├── desktop/                    # 桌面应用
├── nginx/                      # Nginx 配置
├── docs/                       # 文档
├── start.sh                    # 启动脚本
└── stop.sh                     # 停止脚本

API 文档

认证

POST /api/auth/login
{"username": "admin", "password": "your-password"}

会话管理

GET    /api/sessions              # 列出会话
POST   /api/sessions              # 创建会话
GET    /api/sessions/{name}       # 获取详情
DELETE /api/sessions/{name}       # 删除会话
POST   /api/sessions/{name}/command  # 发送命令

文件操作

GET    /api/files?path=/path     # 列出目录
GET    /api/files/content?path=/path  # 获取内容
POST   /api/files                # 创建文件/目录
PUT    /api/files/rename         # 重命名
DELETE /api/files?path=/path     # 删除

WebSocket

const ws = new WebSocket('wss://your-domain:8444/api/ws/session?token=TOKEN')

// 发送命令
ws.send(JSON.stringify({type: 'command', data: 'ls -la'}))

// 发送按键
ws.send(JSON.stringify({type: 'keys', data: 'ls'}))

故障排查

更多问题请查看 常见问题解答 (FAQ)

在 Remote Code 中运行 Claude Code 报错

如果遇到 "Nested sessions are not allowed" 错误,需要取消设置环境变量:

# 添加到 ~/.zshrc 或 ~/.bashrc
unset CLAUDECODE

详见 FAQ - Claude Code 嵌套会话问题

端口被占用

./stop.sh  # 停止所有服务(包括孤儿进程)

WebSocket 连接失败

  • 检查 Nginx 配置中 /api/ws 是否正确
  • 确认 HTTPS 证书有效
  • 查看浏览器控制台错误

语音功能不可用

  • 确保使用 HTTPS 访问
  • 或使用 localhost 测试
  • 检查浏览器是否支持 Web Speech API

安全建议

  1. 保存初始密码: 首次启动生成的随机密码请妥善保存
  2. 使用 HTTPS: 生产环境务必配置 HTTPS
  3. 定期更新: 保持依赖包最新
  4. 限制访问: 使用防火墙限制访问范围

License

Apache License 2.0

贡献

欢迎提交 Issue 和 Pull Request!

About

基于 Go + Vue 3 的远程 Claude Code 管理工具,可以远程监控和控制家中的 Claude Code 会话。

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors