跳到正文
  • 开源
  • AGPL-3.0
  • v0.2.0
  • Bun ≥ 1.3.14
  • TypeScript

一个带驾驶舱而非聊天记录的终端编码智能体。

Rovecode 跑在 Bun 上,能对接 16 个提供方或任意 OpenAI 兼容端点,并让每一次工具调用先经过默认拒绝的策略,再触碰你的仓库。AGPL-3.0 下的自由软件。

$ rovecode "fix the failing test"
rovecode · atlas · feature/authreal frame
160×44 单元格的 sextant TUI:带 git 状态的文件树,代码面板显示 src/auth/callback.ts 并高亮改动行,消息面板列出读取与编辑的工具行以及请求运行 bun test 的批准卡片,计划处于 4 步中的第 1 步,上下文使用 13%,还有等待点头的 rovecode 云朵吉祥物。
+4 −1 已落地先询问 · 批准卡片上下文占 200k 的 13 %

真实画面:bun test 的批准卡片、+4 −1 的编辑行、上下文占 200k 的 13 %。以固定时钟经 sextant 画笔渲染。

  • 2,200+测试
  • 16内置提供商
  • 4策略层
  • 15本页语言
  • AGPL-3.0许可证

一个面向终端的编码智能体。基于 Bun 的 TypeScript,47 个移植模式,每个工具前面都有一条默认拒绝的策略。

运行 rovecode 的团队

  • Northwind Robotics
  • Harbourline Payments
  • Meridian Studio
  • Cobalt Grid
  • Larkspur Health
  • Tessellate
  • Ferrous Labs
  • Quill & Compass

占位名称,待首批客户同意展示后替换。

02驾驶舱

一屏六个面板。你关心的那个文件永远不会被滚走。

带 git 状态的文件、带高亮条和 ± 差异的代码、紧凑的工具行、计划、用量和吉祥物。以固定时钟经 sextant 画笔无界面渲染:与 TUI 绘制时完全相同的代码路径,不是效果图。

消息面板 · 逐行

一次运行,逐行抄自上面的画面。

每次工具调用只占一行:动作、文件、以及改了什么。这次编辑落地为 +4 −1。Shell 命令等在一张有三个答案的卡片后面;Esc 表示拒绝,答案会在本次会话内一直记住。

子智能体不能发问。被禁止的 argv 根本到不了卡片。

03问题 → 解法

终端智能体会出岔子的四件事,以及 rovecode 各自的应对。

用你在键盘前会说的话陈述,用机制及其边界作答。每一条图带都是真实画面的裁切或真实的配置文件。

  1. ~/.rovecode/providers.json
    {
    "default": "kaesra/zai-org/glm-5.3-flash",
    "providers": {
    "kaesra": {
    "baseUrl": "https://api.kaesra.tech/v1",
    "protocol": "openai",
    "keyEnv": "KAESRA_API_KEY"
    },

    01问题

    每个智能体都被焊死在一家厂商的 API 和一张价目表上。

    rovecode 的做法

    一处 StreamFn 接缝加一份活的提供方注册表。16 个具名提供方,或 providers.json 里任意 OpenAI、Anthropic 兼容端点;在另一个终端里新增的提供方,下一次调用就会用上。按角色的回退链会在 429 或 5xx 时向后推进。

    rovecode provider add homelab http://10.0.0.7:8000/v1 --no-key
  2. The messages panel: a user line, the assistant's note, then compact tool rows for read and edit with +5 −2

    02问题

    智能体正在改的那个文件,被聊天记录顶出了屏幕。

    rovecode 的做法

    分面板的驾驶舱:文件、代码、消息、计划、用量和云朵吉祥物。消息面板把每次工具调用压成一行;代码面板只展示真正落地的那一块。

    files · code · messages · plan · usage · rovecode
  3. The approval card: needs your permission, bash rm -rf node_modules && git checkout -- ., with deny selected

    03问题

    模型要求 rm -rf,而没人来得及说不,框架就执行了。

    rovecode 的做法

    先是默认拒绝的通配规则,再是 execpolicy 判定——被禁止的既到不了执行也到不了人,然后是针对修正后参数的批准卡片。四层叠加,且没有一层假装自己是沙箱。

    rules → execpolicy → approval → runtime denylist + cwd lock
  4. The /rewind picker: rewind to a turn, rows #38 to #41 with #40 selected

    04问题

    第 40 轮出了问题,唯一的退路却是重开一段对话。

    rovecode 的做法

    带 sha256 哈希链的仅追加 JSONL 会话树。/rewind 打开轮次选择器,可从任意一轮分叉,并把那一轮的完整文本填回编辑器;shadow-git 检查点以 3 种模式恢复,且从不碰你的 .git。

    /rewind /checkpoints /restore rovecode trace <session-id>
  1. 01sextant 驾驶舱
  2. 02热重载的提供方
  3. 03MCP 客户端
  4. 04安全阶梯
  5. 05会话树 + 检查点
  6. 06面向 Zed 与 JetBrains 的 ACP
  7. 07无界面 HTTP + SSE
  8. 08后台子智能体
  9. 09钩子
  10. 10OpenTelemetry

04能力

十项能力,每一项都是带 file:line 线索的移植。

Rovecode 从 pi、opencode、codex、cline、aider、gemini-cli 等处移植有据可查的模式。只有当一位上下文全新的评审依照动工前写下的标准验证通过,移植才会落地。

界面

sextant 驾驶舱

在至少 100×30 的真彩 TTY 上排布 6 个面板:带 git 状态的文件、带高亮条和 ± 差异的代码、紧凑的工具行、计划、用量、吉祥物。3 套配色,/theme 可热切换;--classic 保留 pi-tui 的聊天界面。

rovecode · ROVECODE_TUI=sextant|classic · /theme night|ember|contrast
sextant 画面的裁切:文件树与带编辑高亮条的代码面板

提供方

热重载的提供方

16 个内置,加上你在 providers.json 里登记的一切。每次调用都按活的快照解析提供方:在另一个终端里添加一个,正在运行的驾驶舱下一次调用就会用它。无需重启。

rovecode provider add|list|test · rovecode model use provider/model
~/.rovecode/providers.json
{
"default": "kaesra/zai-org/glm-5.3-flash",
"providers": {
"kaesra": {
"baseUrl": "https://api.kaesra.tech/v1",
"protocol": "openai",
"keyEnv": "KAESRA_API_KEY"
},
"homelab": {
"baseUrl": "http://10.0.0.7:8000/v1",
"protocol": "openai",
"noKey": true,
"models": ["qwen3-coder-30b"]
}
}
}
  • 上下文

    MCP 客户端

    来自 .rovecode/mcp.json 的 stdio 与 HTTP 服务器。通过 2 个注册表工具惰性披露,空闲的服务器几乎不耗 token。

    mcp_list · mcp_call
  • 安全

    安全阶梯

    每次工具调用运行前都要爬四级。被禁止的 argv 在任何钩子看到之前就被拒绝;--yolo 跳过询问,但绝不跳过拒绝规则。

    rules → execpolicy → approval → runtime

  • 记忆

    会话树 + 检查点

    带 sha256 哈希链的仅追加 JSONL。/rewind 分叉、/resume 续接,shadow-git 检查点以 3 种模式恢复,且从不碰你的 .git。

    /rewind · /checkpoints · /restore
  • 面向 Zed 与 JetBrains 的 ACP

    基于 stdio 的 Agent Client Protocol v1,官方 SDK。

    rovecode acp
  • 无界面 HTTP + SSE

    会话、一条 RunEvent 流、/doc 上的 OpenAPI。端口 4100,仅回环。

    rovecode serve
  • 后台子智能体

    有上限的 FIFO 子会话,默认并发 3 个;笔记会在父会话的下一轮送达。

    /tasks
  • 钩子

    .rovecode/hooks.ts 中 9 个带类型的钩子,各自限时 5 秒。pre_tool 只能拒绝。

    pre_tool · approval · on_event
  • OpenTelemetry

    每次运行一条链路:run ⊃ turn ⊃ tool,带 token、延迟与成本。未设置端点则没有导出器。

    ROVECODE_OTEL_ENDPOINT

05安全与部署

每一次工具调用之前有四层。没有任何东西会离开你未曾配置的机器。

README 怎么讲,安全模型就怎么呈现,连同它的限度。每一层都说明自己判断什么、到哪里为止;它们都不是沙箱。

  1. 层 01

    01rules

    针对工具与 argv 的默认拒绝通配规则。被禁止的模式在任何东西运行之前就被拒绝。

    限度匹配的是模式而不是意图:危险命令的一种新写法会交给下一层。

  2. 层 02

    02execpolicy

    对解析后的 argv 作出裁定:allow、prompt、forbidden。被禁止的既到不了执行,也到不了人。

    限度它读的是命令,而不是命令将要运行的 shell;别名或脚本正文对它是不透明的。

  3. 层 03

    03approval

    针对修订后参数的一张卡片:允许、始终允许、拒绝。答案按会话缓存;子代理无法发问。

    限度这是人的决定:--yolo 跳过这一级,但绝不跳过它上面的拒绝规则。

  4. 层 04

    04runtime

    执行时的 bash 拒绝清单与 cwd 锁;Esc 结束正在进行的调用,在 Windows 上还会结束它的整棵进程树。

    限度是委派,不是隔离。不受信任的工作应放进容器或 microVM。

部署与数据

  • 01

    按定义即自托管

    从源码在你的机器或你的 CI 上运行。账户是可选的:它只解锁定价页面上的套餐,绝不会限制 CLI。唯一的要求是 Bun ≥ 1.3.14。

  • 02

    不回传

    出站流量只去往你配置的提供商、你列出的 MCP 服务器,以及模型请求时的 web_fetch。价格目录是离线快照;没有自动更新。

  • 03

    遥测需自行开启

    在设置 ROVECODE_OTEL_ENDPOINT 之前,OpenTelemetry 导出是关闭的;即便开启,它携带的也只是 id、大小与结果——绝不包含提示词、参数或输出。

  • 04

    审计轨迹来自结构

    会话是只追加的 JSONL,带 sha256 哈希链;每次运行导出一条 trace(run ⊃ turn ⊃ tool),被取消的也不例外。

  • 05

    平台状况

    Windows 优先:开发与发布闸门都跑在 Windows 11 上。POSIX 路径已测试,Linux 与 macOS 尚未经 CI 验证。

  • 06

    许可证

    AGPL-3.0-only。可自由修改与再分发;将修改后的构建作为网络服务运行,则须向这些用户提供其源码。

06来自终端

四张 160×44 的真实画面,值得看的地方都编了号。

以固定时钟经 sextant 画笔无界面渲染:与 TUI 绘制时完全相同的代码路径,不是效果图。把指针移到画面上会将其压平;移到某一行会点亮它的标记。

rovecode · atlas · feature/auth · 160×44real frame
编辑之后的 sextant 画面:差异模式的代码面板显示一块改动,消息面板列出读取与编辑行

编辑落地了。代码面板展示的正是那一块。

在获批的编辑之前拍下;对未经批准的编辑,则由编辑自身的锚点重建。

  1. 1编辑落地时切到 ± 差异模式
  2. 2对照磁盘上的文件读 +4 −1
  3. 3跟着紧凑的工具行走:先读取,再编辑
  4. 4看着上下文填到 200k 的 13 %
rovecode · atlas · feature/auth · 160×44real frame
打开批准卡片的 sextant 画面:bash bun test tests/auth.test.ts,允许 始终 拒绝

一条 shell 命令在等你点头。一张卡片,三个答案。

批准是针对修正后的参数作出的,并按会话记住;子智能体不能发问。

  1. 1运行前看清确切的 argv
  2. 2选择允许、始终或拒绝;Esc 表示拒绝
  3. 3标题切换为正在等你
  4. 4吉祥物请求点头,然后把它记住
rovecode · atlas · feature/auth · 160×44real frame
运行结束后的 sextant 画面:run 模式的代码面板显示 bun test 输出,18 项通过,计划 4/4 完成

测试跑完了。$ 面板留住输出,标题把时钟定住。

PASS 与 FAIL 标记从工具自己的标题行读取退出码。

  1. 1在 $ 模式读运行输出,18 项通过
  2. 2计划在 4/4 步收尾
  3. 3工具行带着输出的最后一行
  4. 4成本按离线目录算作 $0.071
rovecode · atlas · feature/auth · 160×44real frame
打开船员看板的 sextant 画面:两条泳道,写测试进行中,评审已完成

两个后台任务,各占一条泳道,在船员看板上。

子会话共用唯一的智能体循环;退出 TUI 会取消所有还活着的子会话。

  1. 1用 ⌃a 打开 ∷ agents 看板
  2. 2每条泳道显示标签、耗时与状态
  3. 3船员摘要留在计划面板里
  4. 4与此同时父运行仍在继续编辑

07快速开始

三条命令,从克隆到跑起来的智能体。

没有配置提供方时,一次性运行会使用带脚本的模拟提供方;打包冒烟测试也是这么工作的。

  1. 01

    克隆并链接(Bun ≥ 1.3.14)

    CLI 入口是由 bun 执行的 TypeScript,node 跑不了。bun link 会把 rovecode 放进 PATH。

    $ git clone https://github.com/9Code-Labs/rovecode && cd rovecode && bun install && bun link
  2. 02

    接上一个模型

    rovecode setup 会带着你走:挑一个提供方,隐藏着粘贴密钥,做一次很小的测试调用,完成。也可以用 rovecode auth set 直接存密钥,或把 ROVECODE_BASE_URL 指向任意 OpenAI 兼容端点。

    $ rovecode setup
    或
    $ rovecode auth set anthropic
  3. 03

    跑一个任务或打开驾驶舱

    直接输入 rovecode 会打开 sextant 界面。带引号的提示是一次性运行;--output json 恰好返回一个结果对象。

    $ rovecode "fix the failing test"
    $ run · exit 0
    运行输出:18 项通过、0 项失败、41 次 expect() 调用,在 1 个文件中跑了 18 项测试。
13
托管 api
3
本地运行时

08提供方

16 个内置提供方,或任意 OpenAI 兼容 URL。

已保存的凭据优先于 <NAME>_API_KEY 环境变量;显式给出的 ROVECODE_BASE_URL / ROVECODE_API_KEY 组合则优先于两者。

托管 api

本地运行时

  • kaesra
  • openai
  • anthropic
  • deepseek
  • groq
  • openrouter
  • together
  • mistral
  • cerebras
  • fireworks
  • perplexity
  • xai
  • moondream
  • ollama
  • lmstudio
  • vllm

● 本地运行时不需要密钥 · rovecode auth set <名称> 会把密钥存进 ~/.rovecode/credentials.json,在终端里询问且从不回显。

任意端点 · 实时

在另一个终端里添加提供方,正在运行的驾驶舱下一次调用就会取用。无需重启。

$ rovecode provider add homelab http://10.0.0.7:8000/v1 --no-key
~/.rovecode/providers.json
{
"default": "kaesra/zai-org/glm-5.3-flash",
"providers": {
"kaesra": {
"baseUrl": "https://api.kaesra.tech/v1",
"protocol": "openai",
"keyEnv": "KAESRA_API_KEY"
},
"homelab": {
"baseUrl": "http://10.0.0.7:8000/v1",
"protocol": "openai",
"noKey": true,
"models": ["qwen3-coder-30b"]
}
}
}

09他们的话

把评审搬进终端的团队。

  • 评审搬进了终端,审批卡片成了对话本身。交付量不变,来回沟通少了三分之二。

    Aylin Demirci

    Head of Platform · Northwind Robotics

  • 默认拒绝的策略是安全团队签字放行的原因。每一次工具调用都是我们本来就会读的日志里的一行。

    Marcus Oyelaran

    Staff Engineer · Harbourline Payments

  • 十二个人,本地模型,中间没有供应商。它运行在客户代码被允许运行的地方。

    Inés Ferrer

    创始人 · Meridian Studio

为页面撰写的虚构团队示例引言——上线前会换成真实的。

10定价

免费起步。为交付的团队定价。

每个套餐运行的都是同一个代理,背后是同一套默认拒绝的策略。套餐的区别在于你运行多少,以及和谁一起运行。

  • Free

    在你自己的仓库上试用代理。

    $0/ 月

  • Pro

    为每天用它交付的一位工程师。

    $20/ 月

  • Max

    为整周都泡在其中的工程师。

    $200/ 月

  • Teams

    为共享额度、知识和策略的团队。

    $80/ 月

    最低 $80 · 每个完整席位 $40 / 月

查看全部套餐

11常见问题

把质疑,用细节答清楚。

人们把 shell 交给智能体之前会问的七个问题。每个答案都说明机制,以及它到哪儿为止。

这里的一切都取自 README.md 的安全模型、已知限制、可观测性以及许可证与声明几节。README 承认存在的边界,本页同样承认。

不是。每次工具调用之前和周围都有四层叠加运行:默认拒绝的策略规则、execpolicy 判定(被禁止的命令既到不了执行也到不了人)、针对修正后参数的批准关口,以及带 cwd 锁的运行时 bash 拒绝清单。bash 在哪里运行可以选择——直接、WSL2 或 Docker——但每一级都是委托,不是隔离。处理不可信的工作请用容器或微虚拟机。

12获取 rovecode

六个面板。十六个提供方。免费起步,为团队定价。

$ git clone https://github.com/9Code-Labs/rovecode && cd rovecode && bun install && bun link
云朵吉祥物 Rovecode, 竖起大拇指