Drive your dev box from Feishu — shell, Claude Code, opencode, file sync, all in chat cards.
在飞书里远程控制服务器、与 AI 编码助手对话、传输文件——就像把 VS Code Terminal + AI Copilot 装进了飞书。不需要 SSH 客户端,一个飞书就够了。
同时支持 Claude Code 和 opencode 两个 AI 编码助手,通过 SDK 获取结构化输出。
|
Claude Code 模式 |
opencode 模式 |
| 能力 | 说明 |
|---|---|
| 🔄 双后端切换 | !claude / !opencode 随时切换 |
| 🎯 模型热切 | !model 弹菜单卡点按钮切换;!model sonnet 也行 |
| 💼 会话菜单 | !list / !switch(不带参)弹会话菜单卡,按钮切换或新建会话 |
| ⚡ 流式输出 | AI 回复实时更新飞书卡片,不用等完整响应 |
| 🛡️ 工具权限 | Claude 使用工具前弹出权限卡片——点 ✓ Allow / ✗ Deny 按钮,或继续输入数字。项目 .claude/settings.local.json 里 permissions.allow 白名单命中的命令会直接执行(SDK 行为) |
| 💾 会话恢复 | Bot 重启后自动恢复上次 AI 对话上下文 |
| 🔘 交互按钮 | 权限确认、文件覆盖等场景支持点按钮;老的「输入数字」方式依然保留 |
在飞书和服务器之间双向传输文件——发文件自动上传到服务器,!dl 把服务器文件发回飞书。
|
上传(飞书 → 服务器) |
下载(服务器 → 飞书) |
| 能力 | 说明 |
|---|---|
| 📤 上传文件 | 在飞书直接发文件/图片,自动保存到服务器 ~/uploads/ |
| 📥 下载文件 | !dl <path> 把服务器文件发到飞书 |
| 📦 目录打包 | !dl <目录> 自动打包为 tar.gz 下载 |
| 🖼️ 图片预览 | 图片文件以图片消息发送,飞书内直接预览 |
| ✏️ 在线编辑 | !edit <path> 把文件加载进可编辑表单卡片,Save 原子写盘、Cancel 放弃(文件 ≤ 1000 字符,受飞书 input 组件硬上限) |
| 同名文件弹出卡片确认——点 Overwrite / Cancel 按钮,或输入数字 |
在飞书聊天窗口发消息给 Bot,Bot 在服务器执行命令后以卡片形式返回结果——支持 vim、htop 等交互式程序。
| 能力 | 说明 |
|---|---|
| ⌨️ 命令执行 | !sh <command> 执行任意 shell 命令 |
| 🖱️ 交互式程序 | 自动检测 vim / htop / nano,切换原始输入模式 |
| ⌨️ 快捷键 | !esc !enter !tab !ctrl+c 等 |
| 📺 终端截图 | !screen 截取终端画面为 PNG 图片,保留颜色和对齐 |
| 🎨 输出优化 | ANSI 清理、语法高亮、错误标红、短输出优化 |
| 🔤 CJK 支持 | 自动检测系统字体,逐字符 fallback 渲染中文和特殊符号 |
AI 回复以飞书卡片呈现,颜色区分后端,信息丰富一眼识别。
|
🟠 Claude
|
⚫ opencode
|
🔵 终端
|
┌─────────────────────────────────────────────┐
│ 🟠 Claude · session-abc123 · Working... │ ← 橙色 = Claude
├─────────────────────────────────────────────┤
│ │
│ 我来帮你分析这段代码... │
│ 📖 Read(src/config.ts) │
│ 找到以下问题: │
│ 1. getConfig() 缺少错误处理 │
│ │
├─────────────────────────────────────────────┤
│ claude-opus-4-6 · /workspace/project │
│ ↑12.3k ↓2.1k tokens · $0.05 │
└─────────────────────────────────────────────┘
在 飞书开放平台 创建应用:
应用能力 → 添加「机器人」
事件订阅 → 启用「WebSocket」模式
权限管理 → 添加以下权限:
✅ im:message (接收和发送消息)
✅ im:message.receive_v1 (消息接收事件)
✅ im:resource (上传和下载文件/图片)
# 克隆并安装
git clone https://github.com/skjjks/Remote-CLI.git
cd Remote-CLI
npm install
# 创建配置
cp .env.example .env编辑 .env,填入飞书应用凭据:
FEISHU_APP_ID=cli_xxxxx
FEISHU_APP_SECRET=xxxxx
# 留空则允许所有人使用(首次部署推荐留空)
ALLOWED_USERS=📋 完整配置项(点击展开)
| 变量 | 必填 | 说明 | 默认值 |
|---|---|---|---|
FEISHU_APP_ID |
✅ | 飞书应用 App ID | — |
FEISHU_APP_SECRET |
✅ | 飞书应用 App Secret | — |
ALLOWED_USERS |
— | 允许使用的用户 ID,逗号分隔 | 全部 |
ANTHROPIC_API_KEY |
— | Anthropic API Key | — |
ANTHROPIC_BASE_URL |
— | API 代理地址 | — |
TERMINAL_COLS |
— | 终端宽度(列数) | 200 |
TERMINAL_ROWS |
— | 终端高度(行数) | 24 |
CLAUDE_TIMEOUT |
— | Claude 响应超时(ms) | 300000 |
CLAUDE_DEFAULT_MODE |
— | 权限模式 default / auto |
default |
OPENCODE_TIMEOUT |
— | opencode 响应超时(ms) | 300000 |
UPLOAD_DIR |
— | 文件上传保存目录 | ~/uploads |
# 开发模式
npm run dev
# 生产部署(PM2 — 推荐)
npm run deploy在飞书中给 Bot 发送:
!sh echo hello world
💡 收到
hello world就说明一切就绪!
|
|
graph TB
FS["<b>飞书 WebSocket</b><br/>实时消息推送"] --> Router["<b>消息路由</b><br/>index.ts"]
Router --> TH["<b>终端处理</b><br/>handlers/terminal.ts"]
Router --> AH["<b>AI 处理</b><br/>handlers/ai.ts"]
Router --> SH["<b>会话处理</b><br/>handlers/session.ts"]
Router --> FH["<b>文件处理</b><br/>handlers/file.ts"]
TH --> TMUX["tmux"]
AH --> AM["<b>AI Manager</b><br/>ai/manager.ts"]
SH --> SM["<b>Session Manager</b><br/>terminal/session.ts"]
AM --> CD["Claude SDK Driver"]
AM --> OD["opencode SDK Driver"]
CD --> CLI["Claude Code"]
OD --> OC["opencode"]
TMUX --> Shell["Shell"]
Router --> Card["<b>Smart Card Builder</b><br/>bot/card.ts"]
Card --> FS
style FS fill:#4a9eff,color:#fff
style Router fill:#722ed1,color:#fff
style CD fill:#f5a623,color:#fff
style OD fill:#8c8c8c,color:#fff
style Card fill:#52c41a,color:#fff
📦 核心模块详情
| 模块 | 路径 | 职责 |
|---|---|---|
| 消息路由 | src/index.ts |
飞书消息分发、命令解析 |
| AI 驱动 | src/ai/drivers/ |
Claude SDK / opencode SDK 适配 |
| AI 管理 | src/ai/manager.ts |
统一接口、会话生命周期 |
| 终端处理 | src/handlers/terminal.ts |
shell 命令、交互检测、快捷键、终端截图 |
| 终端截图 | src/terminal/screenshot.ts |
ANSI 解析、字体管理、Canvas 渲染 PNG |
| 卡片构建 | src/bot/card.ts |
飞书卡片模板、ANSI 清理、语法高亮 |
| 飞书客户端 | src/bot/feishu.ts |
API 封装、WebSocket 消息收发 |
| 会话持久化 | src/terminal/session.ts |
会话存储、重连、24h 自动清理 |
| 文件传输 | src/handlers/file.ts |
双向文件传输、目录打包、冲突检测、!edit 表单卡 |
| 二进制检测 | src/terminal/binary-detector.ts |
NUL + 控制字节启发式判断是否二进制 |
# 首次部署
npm run deploy
# 日常操作
npm run pm2:status # 查看状态
npm run pm2:logs # 查看日志
npm run pm2:restart # 重启
npm run pm2:stop # 停止
# 开机自启
pm2 startup && pm2 save |
|
npm test # 运行测试 (297 tests)
npm run test:watch # 监听模式
npm run lint # 代码检查
npm run build # 构建📁 项目结构
src/
index.ts # 入口 + 消息路由
config.ts # 环境变量配置
state.ts # 共享状态
ai/
manager.ts # AI 会话管理器
shared.ts # 共享工具函数
types.ts # 接口定义
drivers/
claude-sdk.ts # Claude Agent SDK 驱动
opencode-sdk.ts # opencode SDK 驱动
bot/
card.ts # 飞书卡片构建
feishu.ts # 飞书 API 客户端
handlers/
ai.ts # AI 命令处理
terminal.ts # 终端命令处理
session.ts # 会话管理命令
file.ts # 文件上传下载处理
terminal/
tmux.ts # tmux 封装
session.ts # 会话持久化
interactive.ts # 交互式程序检测
ansi-parser.ts # ANSI SGR 转义码解析
fonts.ts # 系统字体检测与逐字符路由
screenshot.ts # 终端截图渲染 (Canvas → PNG)
binary-detector.ts # 二进制文件启发式判断(NUL + 控制字节)
Made with ❤️ for Feishu
MIT License · Built with TypeScript · Powered by Claude Code & opencode
