tuvis
Health Warn
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Warn
- process.env — Environment variable access in .github/workflows/release.yml
- fs module — File system access in .github/workflows/release.yml
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
兔维斯 Tuvis —— 你的桌面多 Agent 指挥台:会话监控、远程注入、Skill/MCP 资源管理与用量账本,一站式掌控 Claude Code、Codex、OpenCode 等 AI 编程工具
兔维斯(Tuvis)
你的桌面多 Agent 指挥台
一站式监控、通知、跳转、管理 Claude Code / Codex CLI / OpenCode / OpenClaw / Kimi Code / WorkBuddy / ZCode / dsh 的桌面应用
English · 中文
功能概览
会话监控看板
实时红绿灯状态看板,一目了然掌握所有 AI 编程工具的运行状态。
| 状态 | 含义 |
|---|---|
| 🔴 红色 | 等待用户输入 |
| 🟡 黄色 | 处理中 / 思考中 |
| 🟢 绿色 | 空闲 / 已完成 |
- 自动发现运行中的 Claude Code、Codex CLI/APP、OpenCode、OpenClaw、Kimi Code、WorkBuddy、ZCode、dsh 会话
- 区分 CLI 与桌面 APP 形态:APP 类支持会话级深度链接直达(
workbuddy://chat/<id>、codex://threads/<id>,失败自动落 APP 前台保底);ZCode(单窗口多标签)跳转直接聚焦其唯一窗口;dsh(web 宿主)跳转聚焦/打开浏览器中的 dsh 标签页(macOS)。APP 类均支持持久未读卡(转绿跨重启保留、宿主退出自动清理) - 显示项目名称、Git 分支、最后消息预览、CPU 占用、运行时长
- 按优先级排序:等待中 → 运行中 → 空闲
- 标签栏下方「全部」+ 8 工具 chips 单选筛选(图标/配色与卡片徽章同源;选择记忆在本地,计数条保持全量,筛空时如实报出工具名)
- 系统托盘图标反映聚合状态(🔴/🟡/🟢)
远程接入与移动看板(局域网 / 临时隧道 / 自有域名 / 外部域名)
手机浏览器打开与桌面同源的八工具会话看板。设置 → 远程接入,四张通道卡按需开启(各自独立开关、可同时开):
| 通道卡 | 适用场景 | 说明 |
|---|---|---|
| 📶 局域网连接 | 手机与电脑同一 WiFi / 网线(推荐) | 速度最快;需访问密码;本机浏览器访问也走这张卡给出的地址(前提是该开关已打开) |
| 🔀 临时隧道 | 人不在家、手机切蜂窝网络也要看 | 公网免注册(Cloudflare);地址每次开启会变,旧链接失效 |
| 🌐 自有域名 | 想要一个固定入口长期使用 | 需 Cloudflare 账号(免费计划即可)+ Tunnel Token;配置一次后地址永久不变,兔维斯 自动下载并守护 cloudflared,设置页内附逐步图文教程 |
| 🛰 外部域名(免域名) | 没有自己的域名,也想要一个永久地址 | 无需自备域名:卡内向导一键引导安装 Tailscale 并开通 Funnel,拿到形如 https://<机器名>.<尾网名>.ts.net/m 的永久地址;只需一次性在本机安装并登录 Tailscale |
访问密码对本机同样生效:本机(回环)访问不再免密——从这台电脑自己的浏览器打开看板,与远程设备一视同仁(首次输入一次,之后 180 天免输入)。「本机」不再是通道卡:它只是"从本机访问"这一种访问方式,走「局域网连接」那张卡给出的地址。

上图为本分支之前的旧四卡界面(本机 / 局域网 / 临时隧道 / 命名隧道),图中「本机 · 无需密码」的说法已被「门禁零豁免」推翻;新四卡界面待补拍。
接入流程:开启「远程接入」总开关 → 打开对应通道 → 点卡片展开取地址 / 扫码(链接已含访问密码,扫码即自动填入)→ 手机浏览器打开对应地址(必须以 /m 结尾)。外部域名(免域名)首次使用走卡内向导:点「一键配置」后依次是检测 → 从官方源下载并校验安装包 → 安装(系统弹一次管理员确认)→ 登录 Tailscale(兔维斯 把授权链接做成按钮,在浏览器里完成)→ 关闭「阻止传入连接」→ 开通 Funnel → 可达性校验,全程不用碰命令行;macOS 另需在系统设置里批准一次 Tailscale 系统扩展,首次开通 Funnel 可能还需在浏览器里点一次批准(也可能不需要)。
地址只在从公网侧实测校验通过后才显示:校验中或尚未生效时,卡片如实显示「生效中」并按场景给出预期时长(首次开通约 5–6 分钟;此前开通过通常 1 分钟内,此时地址不会变;开机恢复约 1–2 分钟),不会把一个打不开的链接摆在界面上让用户干等;已生效后定期自动复验(约 1 分钟一次,空闲时更疏),异常时自动尝试恢复。地址永久不变、已配对设备免重配,每次开机 兔维斯 会自动恢复该通道(开机后先等 Tailscale 后端就绪再补开通,不会把正在恢复的完好配置清掉)。
访问密码对全部四条通道生效(本机访问同样需要):新设备输入一次 180 天免输入,改密后所有设备需重新输入;「已接入设备」列表可重命名 / 踢下线,上限 10 台。
如实申报:向导内的平台标注与实现同源——Windows 侧的安装与登录流程尚未端到端实机跑过(只实测了其后半段:已安装 / 已登录之后的检测、开通、撤销与重启恢复),macOS 的写路径(开通 / 撤销 / 自愈)也尚未在本平台实机验证(只读探测已实测);向导会在对应平台就地告知,不假装整条流程都验过。
实时看板:会话状态变化 2 秒级推送到手机(SSE 主通道)——横幅 + 提示音 + 振动三件套提醒,点横幅直接进对应会话;断流自动降级为 3 秒轮询,网络恢复后刷新页面即重连。状态跃迁的去重与桌面通知同一套服务端逻辑(手机端拿到的已是去重边沿)。
会话详情页(ZCode 式对话视图,八工具统一):
- 运行中展开明细(思考过程/工具调用可点击展开),执行完成后自动折叠只显最终总结
- markdown 渲染(标题/列表/表格/代码高亮),正文中出现的项目文件路径自动变可点链接
- 文件面板:把会话涉及的文件聚合为一份列表(按最近出现倒序),支持「文档 / 图片」类型过滤与 200 / 500 / 1000 条消息三档追溯范围;已改写的文件名为强调色、仅读过的为常规色(均可点击预览),点次行目录可弹出完整路径
- 文件预览:markdown / 代码高亮 / 图片直显;三种布局随时切换——左右分屏(左对话右文件)、上下分屏、全屏浮层,分屏比例可拖动调整;可读范围为会话项目目录与用户主目录(密钥等敏感目录一律拒绝)
- 传输进度与带宽如实告知:文件上传 / 下载都出进度条(已传字节 / 百分比 / 瞬时速率 / 预计剩余);速率或总量不可知时只显示已传字节,不编假百分比。走带宽受限的隧道通道时,文件面板与附件区就地说明「这是通道限制,不是故障」,并按本通道实测速率给出耗时量级(20 MB 附件下载约 1.5 分钟、上传约 3.3 分钟)与满速升级路径(手机上装 Tailscale 走尾网直连,带宽高 1–2 个数量级)
- 消息书签:长会话里拖到某处觉得「待会回来看」,点书签条上的「+ 书签」选个颜色即可打标(最多 10 个,每色一个);点色点跳回该处,点「管理」可删单个或清空全部。书签保存在浏览器本地:刷新页面不丢、切回看板再进同一会话仍在;关掉 兔维斯(重启)或关闭浏览器标签页后清空
- 字号档位:对话正文字号 50% / 75% / 100% / 125% 四档可调(只影响正文与文件内容,界面控件不变)
- 历史会话区:已结束或失联的会话不再霸屏——登记制归档(历史页按 1/3/7 天懒加载),点卡片进只读详情、可一键重新激活;看板卡片支持关闭/归档(CLI 会话停止进程入档,APP 会话真「叉」语义)
- 进入会话默认停在最新消息处;往上翻到顶有「加载更早消息」按钮,续读时视线停在原处不跳
远程操控 · 手机发消息与审批(试验性 · v0.5.0 起)
不止看,还能操作——手机端向 CLI 会话发消息、批准、答题、切权限,甚至直接新建会话(支持 Claude Code / Codex CLI / Kimi Code / OpenCode 四家,试验性):
- 新建会话:手机端直接拉起一个新 CLI 会话——选候选项目或手填路径(路径黑名单校验)、可带首句自动注入;创建进度实时反馈、完成后自动跳转新会话。四家弹窗形态(信任框/更新框等)经实机 E2E 定案自动处置
- 发消息与排队:会话忙时消息自动排队不丢失;「立即发送」打断插队(各家按实测键序:claude = Esc 中断 + 队列整批取出、codex = Tab 原生队列 / Esc 插队 / Ctrl+C 撤回、kimi = 回合结束自动续发);排队消息可撤回。每条消息走键序注入 + 屏读回执闭环(尾戳逐字校验),未投递如实告知,绝不谎报成功
- 远程审批:工具调用批准(允许/拒绝)、计划确认(计划正文 + 终端对话框选项屏读实时同步、数字直选)、claude 计划批准数字键直达 + 计划反馈条(批准后可对计划发文字反馈 / 一键清除);审批卡使命完成后自动收起
- 远程问答:单选/多选/自由作答(含 Other 覆盖写入与清空——进编辑退格到底再打新文,空文本如实拒),多题逐题推进 + 答完确认卡;多选题点选只勾选、「切换题目」显式推进(opencode/kimi 支持 ◀/▶ 双向)——手机与终端永远同题不错位。确认卡摘要以终端 Review 页屏读为准:刷新/重开页面后逐题答案与终端汇总页完全一致,本地记录只是兜底
- 权限模式切换:kimi 三档(
/permission//yolo//auto)两段式——开菜单后屏读确认高亮才回车,且底栏模式/权限双轴回读(切档回执与当前档都有屏读证据);codex 走终端菜单单选题 - 守卫:对话框挂起时拦截普通消息注入(防误答默认项)、输入行残留检测防双发、Ctrl+C 等危险键黑名单(如 opencode 会整应用退出)
- codex 桌面 APP 会话的写动作在协议通道落地前一律拒绝:APP 形态没有控制台,按键通道对它无效。模式切换 / 权限菜单 / 问答作答 / 审批应答四类动作会在动终端之前返回「开发中」提示,引导回 APP 内操作(被拒操作留审计记录,可在设置页「注入审计」查到)。命令行形态不受影响,只能看不能改的功能照常
| 会话详情 · 消息查看 | 发消息 · 排队与插队 |
|---|---|
![]() |
![]() |
| 审批 · 计划确认 | 问答 · 多选题与确认卡 |
![]() |
![]() |
子 Agent 观察台(移动端已合入)
会话详情实时显示后台子 agent 的运行状态与执行过程:
- 运行 chip:会话消息区下方实时显示后台子 agent(名字 / 时长走字 / token 消耗),点击直达执行详情
- 子 Agent 看板:与文件面板平级的独立看板——单一清单按派发序排列,绿点活跃走字、
灰点完成后冻结原位;点卡片进入执行过程详情 - 执行过程详情:任务原文、思考过程(默认折叠)、工具调用与结果、输出正文;活跃时
5s 一拍自动刷新贴底跟随,完成后定格快照 - 回报提醒开关:子 agent 完成回报唤醒主会话的提醒可独立静默(设置页,默认开)
- v1 覆盖 Claude 全量(经典任务通知 + teammate 空闲通告双机制自动识别);其余工具清单
照常、详情暂不支持
连不上?按这几条排查(均为实测踩过的坑):
- 路由器开了「终端隔离 / AP 隔离 / 访客网络」 —— 最隐蔽的一个:手机和电脑明明连着同一个 WiFi,路由器却禁止无线设备互访,怎么都连不通。到路由器后台关闭该设置(实测踩坑:其余全部排查正常,最后就是它)。
- 临时隧道的地址每次开关都会变 —— 每次开启临时隧道都会重新生成公网地址(旧链接 / 二维码立刻失效),别把它当长期入口;要固定地址请用「自有域名」或「外部域名(免域名)」。切换其他设置不影响本通道。
- 手机地址必须带
/m后缀 —— 完整地址形如http://192.168.x.x:9420/m;推荐直接扫二维码(链接已含访问密码,自动填入),手输漏掉/m会得到 404 空页。 - 从本机访问也要访问密码 —— 「本机」已不是通道卡:本机浏览器访问与远程设备一视同仁(首次输入一次访问密码),地址用「局域网连接」卡给出的那个,且该开关必须打开(服务只在回环监听时这个地址不可达);手机请用「局域网连接」或隧道通道的地址。
- 防火墙放行 —— Windows 首次监听端口会弹「允许访问」,点过取消就会拦入站:Windows 安全中心 → 防火墙 → 允许应用通过防火墙 → 勾选 兔维斯(专用 + 公用都勾)。
- TLS 确认框 —— 局域网直连是明文 HTTP,勾选表示「我知情/我已配 TLS 反代」;家庭局域网直接勾上即可,不需要真配反代。
- 自有域名显示「运行中」但域名打不开 —— 检查 Cloudflare 侧是否配了 Public Hostname(子域 + 域名 + Service 填
HTTP://localhost:9420)——漏做这一步时隧道虽显示 Healthy,但域名无解析、地址打不开(设置页「使用教程」有逐步图文)。 - 「外部域名(免域名)」卡一直显示「生效中」 —— 首次开通后公网 DNS 记录约需 5–6 分钟才发布:本机直连立刻就通,从外网则要等记录,此时卡片不给地址是如实而非故障;长时间不生效可点卡内「打开向导重试」,兔维斯 也会自动重置 Funnel 重开自愈。开机后若显示「恢复中」,那是 Tailscale 后端在重连(通常 1–2 分钟),配置与地址都不会变,无需任何操作。
Foxbell 桌宠
会说话的小狐狸常驻屏幕右下角,实时监控所有会话状态。

- 头顶状态卡片与看板同色同义:🔴 等待操作 / 🟡 运行中 / 🟢 已完成,点卡片直接跳转对应终端
- 语音提醒(内置 31 条语音):等待操作撒娇催促、任务完成求夸、双击闲聊,字幕与语音时长自动对齐
- 拖拽物理:铆钉式跟手拖动、松手重力坠落、抛掷惯性、落地压扁回弹(可关)
- 单击挥手、双击说话、右键菜单:出声 / 字幕 / 物理 / 悬浮最前 / 大小三档 / 场景动作绑定 / 隐藏
- 与看板联动:桌宠开启时接管完成提示音、悬浮最前时抑制通知浮窗;看板 🦊 按钮、系统托盘、设置页多入口开关互通
- 悬停宠物约 0.5 秒出浮窗(迷你条 / 状态卡片);移开后留 2 秒宽限再收起,
够出从容点「详情 »」的时间(2026-10-07 由 200ms 放宽,此前会被判为「够不到」) - 「启动时跟出」开关(设置页「通知与桌宠」块,默认开):决定桌宠是否随兔维斯一起启动显示;关掉后它不再自动跟出,且该选择会被记住、不被启动兜底逻辑覆盖
外部桌宠
v0.3.0 起桌宠格式开放,不再只有 Foxbell:
- 导入自定义宠物:本地 zip / 目录导入,或从 Petdex 在线仓库下载;manifest 结构、帧率、尺寸、语音清单全量校验
- 管理面板:导入 / 描述编辑 / 重命名 / 删除 / 一键切换,宠物窗口热切换无需重启;删除或切换后活动宠物自动恢复
- 能力门控:无语音的宠物自动降级为纯动画(瞬态动作保留),语音能力双向同步
Token 用量看板(用量账本)
七个工具(Claude Code / Codex / Kimi Code / OpenCode / ZCode / WorkBuddy / dsh)的 token 用量统一记账:
应用启动后延迟采集一次,并开放 usage_collect 供前端按需触发(单飞互斥 + 默认 10 分钟的最小间隔兜底);
采集走独立按需路径,不进入 3 秒会话轮询。账本落在 ~/.tuvis/tuvis.db 的 4 张表(明细按小时桶、日聚合永久保留、
采集游标、会话维度),明细默认保留 90 天(可配),到期只保留日聚合。
界面已落地(阶段②):设置页「用量统计」分区——总开关(关闭后零扫描)、迷你条时间档(当日 / 近 5 小时 /
近 7 天)、迷你条工具行数(1–7)、明细保留期、采集间隔等 8 项设置即时保存;另有「采集状态」分区
(采集状态自查 + 立即采集)。桌宠迷你条:浮窗常驻 5 行核心指标(请求+命中率 / 缓存命中+产出 /
四桶明细 / 报错 / 最长单 turn,行序钉死),时间档与工具行数随设置联动。
口径说明(务必先读)
- 四桶:未缓存输入 / 缓存读 / 缓存写 / 产出;请求输入与命中率由缓存语义三态
(互斥 / 包含 / 仅总量)派生。各源语义不一致,同一工具不同记录也可能不同——
Codex 逐条用total_tokens算术判定(本机实测:正确判据命中率 92.69%,一律按包含会得到
>100% 的荒谬值)。拿不准时一律按「互斥」(算错的后果是命中率偏低,而不是静默多算)。 - 含子代理:token 总量包含子代理/侧链用量;会话数与 turn 数按父子分层(不把一次对话算成多次)。
- 子代理标记只在小时档有真值:分组行的子代理标记(
isSubagent)在小时档给出true/false;
日档与记录页卡内行恒为空态null(这两档的行维度不含会话,算不出)——空态不得当作false(「不含子代理」)读。 - turn 数不跨工具合计(各源判据语义不可比);最长单 turn 逐工具给 p50 + 最长,
且含挂机、未剔除 idle。 - 报错三层分列 + 用户主动打断单列(三层互不包含,相加没有意义)。
- 不可得的指标显示空态,不显示 0:用户输入(估) 只对 claude / codex / kimi 计算,
其余源在小时档与日档都显示空态;WorkBuddy 无回合概念、无时长字段、供应商不可得;
OpenCode 工具级错误不可得;kimi 的用户主动打断判据缺失;dsh 的报错与最长 turn
只能从原始会话日志取(只有一部分会话仍留有原始日志——比例不写死:覆盖率随机器与
会话清理策略变化,探测期的「19/99」已作废)。这类部分覆盖不在界面表达(2026-10-06 用户裁决):
取到的照常显示,取不到的位次是—,界面不设「部分覆盖」档(详见docs/superpowers/specs/2026-10-03-pet-token-usage-dashboard-design.md§9.5.1)。 - 总开关默认开:关闭后不采集、不落库(也不做保留期清理),看板 / 记录页查询走关闭态早退;
但 CSV 导出目前不受总开关门控,关闭态仍可导出既有账本历史(该不对称是已登记的待裁口径)。 - 「按项目」按记录归属:一个会话文件可跨多个项目(同一条会话记录内的 cwd 才算它的项目),
项目名与首页会话卡片同源(projectName);Windows 上各源路径大小写形态不同,
同一目录可能裂成两组;无 cwd 的记录落Unknown。 - 隐私:账本查询与后续呈现面只出现结构化数字与静态文本(工具名、模型名、项目名、会话标题),
不含任何 prompt 原文或代码内容;CSV 导出只含结构化账本列,会话标题与原始路径不进 CSV。
CSV 导出为 UTF-8 with BOM(Excel 兼容)。
桌面通知与提示音
- 状态颜色变化时发送桌面通知(红↔黄↔绿),带去重机制
- Web Audio API 提示音,无需音频文件
- 设置中可开关
- 通知可点击,附带「查看会话」动作直接跳转终端
开机自动启动
- 设置页「通知与桌宠」块、以及系统托盘「显示窗口」项下方,两处均可开关——共用同一条读写路径、勾选态回环一致
- 开关显示的是系统里的真实状态(Windows 读注册表启动项,含任务管理器里的启用/禁用标记;macOS 读登录项),界面显示即实际状态,不落本地缓存、不会漂移;开关失败回滚并如实报错
- 自启拉起时主窗口静默进托盘、桌宠照常跟出(不会开机弹一屏)
- Windows 卸载时由安装器钩子清理该用户的启动项;macOS 无卸载钩子,需手动移除
~/Library/LaunchAgents/下对应的 plist
快速跳转终端
点击会话卡片即可瞬间聚焦对应终端标签页:
| 终端 | 支持情况 |
|---|---|
| iTerm2 | ✅ AppleScript |
| Terminal.app | ✅ AppleScript |
| tmux | ✅ pane 选择 + 终端聚焦 |
| Windows Terminal / conhost | ✅ 进程树消歧 + 一次性标题标记锁定(Windows) |
| 浏览器标签(dsh) | ✅ 标签页聚焦/打开(macOS) |
| Wayland | ❌ 优雅降级提示 |
终端类工具(Claude Code / Codex CLI / OpenCode / Kimi Code)经进程树 + 窗口内容逐层消歧聚焦;同项目双开直达:Kimi / OpenCode 的窗口标题与会话标题(kimi state.json 标题 / OpenCode DB 标题)归一化比对,唯一命中即锁定,双开终端不再弹选择器。Windows 上消歧还会对目标终端贴一次性身份标记( — 兔维斯:xxxxxxxxxxxx,聚焦成功后自动清除)正向锁定,且标记不会叠加残留;卡片↔终端配对存疑(同项目多开)时宁可弹选择器也不锁错窗,聚焦被系统拒绝时显式报错而非静默假成功。
桌面 APP 类工具(Codex APP、WorkBuddy)支持深度链接直达:codex://threads/<id>、workbuddy://chat/<id>(会话级),派发前校验协议 handler、派发后验证前台化,失败自动落 APP 级前台保底(macOS AppleScript / Windows 近祖聚焦),且不误标已读。ZCode 为单窗口多标签应用,跳转直接聚焦唯一窗口(卡片携带宿主 pid,零歧义锁定)。
扩展资源统一管理
Skill / MCP 服务器 / 插件的统一仓库,一键映射到各工具:
- Skill:符号链接(Unix)/ 交接点(Windows)映射到各工具的 skill 目录
- MCP 服务器:自动格式转换 —— JSON(Claude / Kimi / WorkBuddy)/ TOML(Codex)/ JSONC(OpenCode)/ JSON 嵌套子树(ZCode:
mcp.servers,读-改-写只动该子树、未知键与原键序保留) - 插件:文件/配置混合管理
- 首次启动自动导入已有 skill(从
~/.claude/skills/、~/.codex/skills/、~/.config/opencode/skills/等各工具目录,以及共享目录~/.agents/skills/) ~/.agents/skills/为只读共享导入源(来源标签agents-shared):兔维斯 仅扫描入库(不归属工具、不建链),codex / zcode 等遵循开放标准的工具直接读取该目录- 重新扫描按钮发现新安装的 skill
预设组一键切换
将 Skill + MCP + 插件打包为命名预设组,一键应用/取消:
- 一键应用到任意工具 —— 自动适配各工具的配置格式
- 部分成功处理:失败项报告错误,不回滚已成功项
- 冲突检测:跳过已存在的资源
- 系统托盘菜单集成,快速切换
子 Agent 级资源分配
为多 Agent 工具(OpenCode 等)的子角色分配资源子集:
- 子 Agent 分配受工具级启用范围约束
- 工具级禁用自动级联到所有子 Agent
工具勾选管理
设置页独立分区,按工具决定是否纳入 兔维斯 监控与管理:
- 行式开关列表:图标 + 名称 + 安装状态 badge,本地暂存、批量保存,保存前确认弹窗列出还原/回溯清单,未保存离开自动拦截
- 取消勾选 = 彻底还原:符号链接还原为真实文件、MCP 条目从工具配置移除、未读卡清空;SSOT 仓库与 DB 分配关系保留,重新勾选按原分配整体重建(失败自动回滚,重新保存即幂等重试)
- 未勾选工具彻底隐藏:会话扫描跳过、通知静音、资源/预设界面不出现,相关写命令返回明确错误(结构化错误码 + 中英文案)
信号健康度(Hook 信任门自查)
设置页独立分区,自查各工具的 Hook 通道是否真正在工作:
- 每个支持 Hook 的工具显示注册状态、最近事件时间与待办提示(数据来自既有 Hook 事件目录与会话扫描快照,打开分区/手动刷新时各拉一次,无后台轮询)
- 判据:已注册 + 该工具存在活跃会话 + 30 秒窗口内零事件 → 显示「需在工具终端输入 /hooks 并信任 兔维斯 条目(一次性)」,附一键复制
/hooks命令 - codex 存在信任门:兔维斯 注册成功 ≠ 事件触发,需在 Codex TUI 内输入
/hooks人工信任一次(信任后哈希落用户层配置);首次注册完成 兔维斯 会发一条一次性桌面通知提醒
已知限制:判据基于 30 秒 TTL 事件窗口,活跃会话单次长操作静默超过 30 秒时会短暂误报待办——本分区是启发式自查面板,以工具终端实际状态为准。
技术栈
| 层级 | 技术 |
|---|---|
| 桌面框架 | Tauri v2(Rust) |
| 前端 | React 19 + TypeScript |
| UI 组件 | shadcn/ui(Radix UI) |
| 样式 | Tailwind CSS v4 |
| 状态管理 | Zustand |
| 国际化 | i18next(中文 / English) |
| 数据库 | SQLite(via rusqlite) |
| 进程监控 | sysinfo |
架构
src-tauri/src/
├── adapter/ # Agent 适配器 trait + 各工具实现
│ ├── claude.rs # Claude Code(JSONL + Hook)
│ ├── codex.rs # Codex CLI/APP(JSONL + Hook)
│ ├── opencode.rs # OpenCode(SQLite)
│ ├── openclaw.rs # OpenClaw(state.json)
│ ├── kimi.rs # Kimi Code(session_index + wire.jsonl)
│ ├── workbuddy.rs # WorkBuddy(心跳驱动 + JSONL)
│ ├── zcode.rs # ZCode(宿主判定 + SQLite 会话聚合)
│ ├── dsh.rs # dsh(web 宿主 + zstd 多帧日志)
│ └── mod.rs # AgentAdapter trait + 工具注册表 + 会话发现调度器
├── monitor/
│ ├── process.rs # 进程发现(sysinfo 扫描)
│ ├── claude_parser.rs # Claude 解析器(message.role 协议)
│ ├── codex_parser.rs # Codex 解析器(rollout JSONL 协议)
│ ├── opencode_parser.rs # OpenCode SQLite 解析器
│ ├── openclaw_parser.rs # OpenClaw state.json 解析器
│ ├── kimi_parser.rs # Kimi Code 解析器(session_index + wire.jsonl)
│ ├── workbuddy_parser.rs # WorkBuddy 解析器(心跳 + JSONL 尾部推导)
│ ├── zcode_parser.rs # ZCode 解析器(tasks-index + session/message/part 双 SQLite)
│ ├── dsh/ # dsh 解析器(projcache + zstd 多帧日志 + 状态/预览五模块)
│ ├── jsonl.rs # JSONL 读取公共件(尾部读取、文件枚举)
│ ├── cwd.rs # cwd 归一化(进程 ↔ 会话匹配公共设施)
│ ├── git.rs # GitHub URL 查询(进程内缓存)
│ ├── path_codec.rs # Claude projects 目录名编解码
│ ├── project.rs # 项目名提取与 cwd 形态校验
│ ├── status.rs # 纯消息状态判定
│ └── hooks.rs # Hook 注册 + 事件文件读取
├── services/ # 业务服务(按功能域拆分)
│ ├── skill/ # Skill 安装/启用/禁用 + 自动导入
│ ├── resource/ # 资源扫描、SSOT 导入、补链
│ ├── mcp/ # MCP 配置写入(JSON/TOML/JSONC)
│ ├── preset/ # 预设应用/取消 + 兼容性检查
│ ├── plugin/ # 插件管理
│ └── manifest/ # 扩展清单校验与更新检查
├── linker/
│ ├── mod.rs # 符号链接/交接点管理 + 安全检查
│ ├── detector.rs # 工具安装检测
│ ├── layer2.rs # Layer 2 工具级激活目录
│ └── layer3.rs # Layer 3 子 Agent 级激活目录
├── commands/ # 按模块拆分的 Tauri IPC 命令
├── database/ # SQLite 数据层(schema/migration/dao)
├── session/ # 会话模型 + 状态枚举
├── window/ # 终端聚焦(iTerm2/Terminal.app/tmux)
├── plugins/
│ └── system_tray.rs # 系统托盘(状态 + 预设菜单)
└── lib.rs # 应用入口 + 插件注册
src/
├── pages/ # 首页 / 设置 / 关于
├── components/
│ ├── SessionCard.tsx # 带状态灯的会话卡片
│ ├── SessionGrid.tsx # 看板网格
│ ├── ExtensionList.tsx # 双视图(按分类/按工具)资源管理
│ ├── ResourceByKindView.tsx # Skill/MCP/Plugin 三栏视图
│ ├── ResourceByToolView.tsx # 四工具卡片视图
│ ├── ImportDialog.tsx # 原生资源扫描与导入
│ ├── CompatibilityDialog.tsx # 预设兼容性检查
│ ├── PresetList.tsx # 预设组增删改查
│ └── ui/ # shadcn/ui 基础组件
├── hooks/ # useSessions, useNotification, useUpdater
├── stores/ # Zustand 会话存储
├── lib/ # 音频、快捷键、更新器、窗口工具
├── i18n/ # 中文 + 英文语言包
└── types/ # TypeScript 类型定义
快速开始
环境要求
- Node.js ≥ 18
- pnpm ≥ 8
- Rust ≥ 1.77
- Tauri v2 CLI
安装与运行
# 克隆仓库
git clone https://github.com/jarvislee90s-dot/tuvis.git
cd tuvis
# 安装前端依赖
pnpm install
# 启动开发模式
pnpm tauri:dev
macOS 开发版提示:开发版(未签名打包)首次使用「一键恢复会话」开窗前,需在
系统设置 > 隐私与安全性 > 自动化 中手动允许 兔维斯 控制
Terminal / iTerm2 一次(TCC 不会自动弹窗)。未授权时 osascript 以 -1743 失败,
resume 会回执「macOS 自动化授权缺失」并给出该指引。
构建
# 构建发布版(Windows NSIS 安装包)
pnpm tauri:build
helper 构建门(批次丙 T2 固化):
tuvis-hook-listener(hook 事件监听 helper)
与tuvis-marker(窗口标题标记)都挂在 Cargorequired-features门后——不带
feature 时根本不构建,应用启动的ensure_hook_script就找不到同目录 helper、
跳过安装,~/.tuvis/bin/里那份永远是旧构建(实测故障:事件缺tool_name载荷 →
问答卡通道 A 永不识别)。
pnpm tauri:dev/pnpm tauri:build已内置 feature(hook-listener与marker-helper,后者蕴含前者),照常用即可;- 单独构建 helper(如跑实机
#[ignore]测试)必须显式带上:cd src-tauri && cargo build --bin tuvis-hook-listener --features hook-listener;- 跑 bin 测试同理:
cargo test --bin tuvis-hook-listener --features hook-listener;- macOS 打包(
release:macos/ release.yml 的 macOS job)走的是裸pnpm tauri build显式参数,不受上述 npm script 影响——额外 bin 会令
universal 打包失败,故 macOS 侧有意不带 feature(helper 为 Windows 通道)。
代码检查与格式化
pnpm check # format:check + lint + build
pnpm format # Prettier 自动格式化
pnpm lint # ESLint 检查
pnpm lint:fix # ESLint 自动修复
配置
应用数据存储在 ~/.tuvis/:
| 路径 | 用途 |
|---|---|
~/.tuvis/tuvis.db |
SQLite 数据库(设置、扩展、预设、会话缓存) |
~/.tuvis/skills/ |
全局 Skill 仓库 |
~/.tuvis/mcp/ |
全局 MCP 服务器配置 |
~/.tuvis/hooks/status-hook.sh |
共享 Hook 脚本(状态事件) |
~/.tuvis/events/ |
Hook 事件文件(自动清理,30 秒 TTL) |
各工具配置支持
| 工具 | Skill 目录 | MCP 配置 | MCP 格式 | Hook 支持 |
|---|---|---|---|---|
| Claude Code | ~/.claude/skills/ |
~/.claude.json |
JSON | ✅(PascalCase) |
| Codex CLI | ~/.codex/skills/ |
~/.codex/config.toml |
TOML | ✅(PascalCase) |
| OpenCode | ~/.config/opencode/skills/ |
~/.config/opencode/opencode.json |
JSONC | ❌ |
| OpenClaw | ~/.openclaw/skills/ |
~/.openclaw/openclaw.json |
JSON | ❌ |
| Kimi Code | ~/.kimi-code/skills/ |
~/.kimi-code/mcp.json |
JSON | ✅(PermissionRequest / PermissionResult) |
| WorkBuddy | ~/.workbuddy/skills/ |
~/.workbuddy/mcp.json |
JSON | ❌(状态经心跳 + JSONL 推导) |
| ZCode | ~/.zcode/skills/ |
~/.zcode/cli/config.json |
JSON(mcp.servers 嵌套子树) |
❌(状态经 SQLite 消息流尾部推导) |
| dsh | ◐ 只读接入 + 启停 | N/A(探测不支持) | N/A | ❌(状态经 lock 交叉判定 + 事件流推导) |
注:
~/.agents/skills/是 Agent Skills 开放标准的跨工具共享目录(codex / zcode 等直接读取)。兔维斯 对 codex 的 skill 激活目录为私有~/.codex/skills/;.agents仅作只读共享导入源(来源标签agents-shared)——兔维斯 扫描入库、不归属工具、不建链;除一次性迁移 兔维斯 自建遗留链接外,永不写入该目录。
Kimi Code 数据目录重定向
Kimi Code 支持 KIMI_CODE_HOME 环境变量重定向数据根(默认 ~/.kimi-code,早期版本为 ~/.kimi,应用会自动回退)。注意本应用读取的是自身 GUI 进程的环境变量:
- macOS 从 Dock / Spotlight 启动的应用不继承 shell 配置(
.zshrc等)中的export KIMI_CODE_HOME=...; - 需要 GUI 侧生效时,可执行
launchctl setenv KIMI_CODE_HOME <路径>后重启本应用,或直接为用户设置全局级环境变量。
路线图
- US1 — 多工具会话监控看板
- US2 — 状态变更通知与提示音
- US3 — 终端快速跳转(iTerm2/Terminal.app/tmux)
- US4 — Skill/MCP/Plugin 统一仓库管理
- US5 — 预设组一键切换
- US6 — 子 Agent 级资源分配
- 资源看板重设计(双视图 + 导入 + 兼容性)
- OpenClaw 支持(第四工具)
- Kimi Code 支持(第五工具:会话监控 + MCP 管理 +
KIMI_CODE_HOME数据目录重定向) - WorkBuddy 支持(第六工具:心跳驱动监控 + 深度链接跳转 + 资源管理)
- ZCode 支持(第七工具:SQLite 会话聚合监控 + 子代理活跃度仲裁 + 唯一窗口聚焦跳转 + Skill/MCP 资源管理)
- dsh 支持(第八工具:web 宿主监控 + zstd 多帧日志解析 + 三色状态 + 浏览器标签跳转 + Skill 只读接入)
- Foxbell 桌宠(状态卡片 + 语音提醒 + 拖拽物理)
- 外部桌宠开放(本地/Petdex 导入 + 管理面板热切换 + 能力门控)
- 工具勾选管理(批量保存 + 还原/重建 + 彻底隐藏)
- APP 类工具会话卡与深度链接跳转
- 插件管理(文件/配置混合)
- i18n(中文 + English)
- GitHub Releases 自动更新(v0.5.1 重做:prerelease 渠道 + 忽略本版本 + 标题栏升级徽标)
- 暗色/亮色主题跟随系统
- Windows 支持(NSIS 安装包 + 深度链接 + 近祖窗口聚焦)
- 远程操控二期(v0.5.0 · 试验性)——手机端发消息/排队插队/远程审批/问答/权限切换(Claude Code / Codex CLI / Kimi Code / OpenCode)
- 移动端历史会话区(登记制归档 + 重新激活闭环)
- 远程接入 · 外部域名(免域名)固定地址通道(Tailscale 一键引导开通 + 公网侧可达性校验 + 开机自动恢复;本机访问不再免密)
- 外部域名向导 Windows 实测收口(v0.5.1)——Tailscale CLI 自定义路径查找治本 + 登录步主动递授权链接(不代登录)
- Token 用量看板(阶段① 采集底座与账本 + 阶段② 设置分区 / 桌宠迷你条呈现;口径说明见「Token 用量看板」一节)
- 子 Agent 观察台(移动端:会话运行 chip + 子 Agent 看板 + 执行过程详情)
- 开机自动启动(设置页 + 托盘双入口;真值源 = 操作系统侧状态实时读,不落本地缓存)
- 看板按工具筛选(桌面端 8 工具 chips 单选 + 本地记忆,与移动端同口径)
- Linux 支持
- Kitty & WezTerm 终端跳转支持
写在 v0.5.1
这仍然是一个比较早期的版本。远程操控的键序注入链路(注入 → 屏读 → 回执)已用四个工具逐键实测打磨;v0.5.1 又把外部域名(免域名)向导在 Windows 上从零端到端走了一遍,实测暴露的缺口(自定义安装路径查找、登录授权链接)全部修掉。但终端形态千变万化,边缘场景一定还有没踩到的坑。
希望更多朋友能体验「人离开桌面,Agent 不停工」——看板上的红绿灯在手机里跳动,批准一次计划只需一次点击。使用中遇到任何问题,欢迎直接提 Issue(附终端工具与版本号),我们会尽量远程响应大家的需求。
参与贡献
欢迎提交 Pull Request!
- Fork 本仓库
- 创建功能分支(
git checkout -b feature/amazing-feature) - 提交更改(
git commit -m 'feat: add amazing feature') - 推送到分支(
git push origin feature/amazing-feature) - 打开 Pull Request
请阅读 AGENTS.md 了解项目架构与开发规范。
许可证
本项目采用 MIT 许可证 —— 详见 LICENSE 文件。
二次开发指引
欢迎 fork 与二次开发。按 MIT 许可证的要求,分发衍生版本时请保留原版权声明与许可证文本;在此基础上,欢迎(非强制)在项目说明中注明"基于兔维斯(Tuvis)二次开发"并回链本仓库,帮助用户识别上游。品牌名称与 Logo 的使用边界见 TRADEMARK.md。改进欢迎以 PR 形式回馈上游,让你的成果随主线一起演进。
商标与非官方声明
兔维斯 是一个独立的开源项目,与 Anthropic(Claude / Claude Code)、OpenAI(Codex / ChatGPT)、OpenCode、OpenClaw、月之暗面(Kimi Code)、WorkBuddy、ZCode、dsh 及本仓库提及的其他任何公司或产品均无关联、未获其背书或赞助。文中出现的名称与商标归其各自所有者所有,仅用于描述兼容性(名词性合理使用)。应用内图标为原创设计,部分配色仅用于辨识对应工具,不代表任何官方身份。
官方渠道
本项目唯一的官方发布渠道是本仓库的 GitHub Releases。任何其他网站或渠道提供的下载均为第三方分发,请自行甄别风险。品牌使用规范见 TRADEMARK.md。
多终端能力矩阵(总表,随版本随时更新)
12 行能力 × 8 个终端(✅ 支持 / ◐ 部分 / 🧪 试验性 / ❌ 不支持)——本表为能力总表,每次发版随功能增删更新(结构化源:docs/capabilities.json,与官网同源):
| 能力 | Claude Code | Codex CLI | OpenCode | OpenClaw | Kimi Code | WorkBuddy | ZCode | dsh |
|---|---|---|---|---|---|---|---|---|
| 会话监控(红绿灯) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 本机桌面通知 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Skill 管理 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ◐ 只读 |
| MCP 管理 | ✅ JSON | ✅ TOML | ✅ JSONC | ✅ JSON | ✅ JSON | ✅ JSON | ✅ JSON 子树 | ❌ |
| 插件管理 | ✅ | ✅ | ✅ | ✅ | ◐ 文件型 | ❌ | ❌ | ❌ |
| 状态 Hook | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
| 手机 · 消息查看 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| 手机 · 文件预览 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| 手机 · 发消息(注入) | 🧪 | 🧪 | 🧪 | ❌ | 🧪 | ❌ | ❌ | ❌ |
| 手机 · 新建会话 | 🧪 | 🧪 | 🧪 | ❌ | 🧪 | ❌ | ❌ | ❌ |
| Token 用量采集 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| 手机 · 子 Agent 观察台 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
手机操控:消息查看与文件预览覆盖 7 家(OpenClaw 为黑盒形态暂不支持远程查看);发消息(注入)与新建会话处于试验阶段,目前支持 Claude Code / Codex CLI / OpenCode / Kimi Code 四家。OpenClaw / WorkBuddy 为黑盒形态(无外部写通道)、ZCode 预留无头通道、dsh 写通道另评——工具差异如实呈现,不假装统一。
四个可注入终端的现状与不足(如实呈报):
- Claude Code:忙时消息排队不丢;「立即发送」= Esc 打断 + 队列整批取出开新回合;撤回窗口保护(输入行有残留时拒绝投递并如实回报);计划批准卡(批准等待红灯 + 数字键直达 + 批准后计划反馈条);问答多题 ←/→ 双向切题 + 多选自由作答(已写入后可编辑/覆盖写入/清空);多选问题面板不再被误读为审批卡(复选框守卫 + 审批键禁用)。
- Codex CLI:Tab 进原生队列(不打断当前回合)、Esc 插队打断、Ctrl+C 撤回排队消息;问答支持备注栏(Tab 展开/清空,终端 note 行屏读同步回输入框)+ 多选自由作答;模式/权限远程切换——模式计划↔操作 chips 直选(当前档高亮)、权限四档直选(含 Full Access 二次确认),切换结果以终端屏读为准。不足:多题切页键未实测(多题切题引导终端完成)。
- Kimi Code:忙时排队回合结束自动续发;权限三档两段式切换(开菜单屏读确认高亮)+ 底栏模式/权限双轴回读;2.1.1 问卷全链——Other 自由作答(编辑/覆盖写入/清空)、多选勾选、单选自动推进 + 落点校验(n 题选完必落 n+1)、切题 ←/→、确认卡摘要以终端 Review 页屏读为准。不足:审批数字选择禁用(与菜单键冲突,改走导航);
Ctrl+S立即引导未产品化。 - OpenCode:问答 enter / 数字切换选择 + 单选/多选自由作答(覆盖写入/清空、单选自愈送达);◀/▶ 双向切题;Esc 打断插队;2.x 双 schema 会话发现。不足:Ctrl+C 全局禁用(会直接退出 opencode 应用)。
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found



