README
¶
Moss
One Intent → One Task → One Agent Loop → One Verified Result. 一句话意图 → 一个任务 → 一个 agent loop → 一个被验证的结果
中文 · English
Moss 是一个精简的跨平台 coding agent harness,也是一套面向机器人开发的 Agent Task OS: 把一句话意图变成带可机检验收标准的状态机任务,跑完 agent loop 后——没有证据背书就不算完成。 它用 SSH 直连 RDK / Linux 真机,所以这里的"完成"可以是板子真的做到了。
- TypeScript / ESM 单包 · Node ≥ 22.16.0 · Linux / macOS / Windows
- 无账号、无云服务、无遥测——provider 就是普通 HTTP 端点
- 四种交互面:全屏 TUI · readline REPL · headless CLI · 可嵌入 SDK
环境
先看 Node 版本(硬性前提:Node ≥ 22.16.0):
node -v
没有合格 Node 时,先装再继续(可复制):
- macOS:
brew install node@22,或nvm install 22 && nvm use 22/fnm install 22 && fnm use 22 - Ubuntu / Debian: NodeSource(nodesource/distributions)或同上 nvm / fnm
- Windows(PowerShell):
winget install OpenJS.NodeJS.LTS - 国内网络:
npm config set registry https://registry.npmmirror.com;nvm 下载 Node 可设NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
Node 低于 22.16 时,npm install -g @rdk-moss/agent@latest(以及源码路径的 preinstall / prepare)会立刻非零退出,打印当前 Node 版本和可复制的升级命令(含成功后再跑的 npm install -g @rdk-moss/agent@latest),不会留下坏掉的全局 moss。Node 22.16 自带 npm 10,不要按 npm 的提示升级到 npm 12:这个 Node 不支持 npm 12。
macOS
Git 需要 Xcode Command Line Tools。没有 git 时运行 xcode-select --install。Moss 自己不需要 C 编译器,cpu-features 的可选原生构建失败也不影响运行。全局目录没有写权限时,用下面的用户级 prefix。
Windows
先装 Git for Windows。PowerShell 的执行策略可能拦截 moss.ps1。只给当前用户放开脚本:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
把 %APPDATA%\npm 加进 PATH。这是 npm 在 Windows 上的默认全局命令目录。
快速开始
推荐(一行): 已装 Node ≥ 22.16 时:
npm install -g @rdk-moss/agent@latest
moss --version
moss
如果以前装过旧的未加 scope 的 moss 包,先执行 npm uninstall -g moss,否则两个包抢同一个 moss 命令,npm 会报 EEXIST。不要加 --force:它会同时留下旧包和 @rdk-moss/agent,之后再 npm uninstall -g moss 会把 moss 命令一起删掉。
全局目录没有写权限(EACCES)时,把 prefix 放到用户目录,或改用 nvm(Node 装在家目录里):
npm config set prefix ~/.npm-global
把 ~/.npm-global/bin 加进 PATH,然后重新打开终端。
从源码开发(可选)
贡献 / 改代码时用克隆。npm ci 会跑 prepare(先检查 Node,再 npm run build),所以不用再单独构建:
git clone https://github.com/D-Robotics/moss.git
cd moss
npm ci
npm install -g --install-links .
moss
npm 11 可能打印 npm warn install-scripts。npm ci 可能会点名 ssh2 和 cpu-features。接下来的 npm install -g --install-links . 还可能点名 @rdk-moss/agent(它的 preinstall 和 prepare)。这是提示,安装仍然成功:ssh2 没有可选的原生模块也能用,全局副本里已经有 dist/。不要运行 npm audit fix --force,它会改依赖版本,装完不能用。
没有可用配置时,moss 就在这个界面里设置(按数字选服务商,或按 Enter 使用环境里已有的 key,内容不会显示)。D-Robotics 地瓜网关是第一项,已经预选(地址 https://ai-api.d-robotics.cc/v1,默认模型 deepseek-flash,只问 key)。不想把 key 写进文件时,先指定服务商再写变量名:moss config set provider d-robotics,然后 moss config set apiKeyEnv <变量名>。只写 apiKeyEnv、不写服务商或地址时,会先问选哪一家,不会把 key 发给默认的 DeepSeek。设好后在同一会话里说:
看一下这个目录里有什么
自定义 OpenAI 兼容网关
内置预设之外的网关用 openai-compatible。四条命令分别写入服务商、模型、地址和密钥变量名(apiKeyEnv 的值是变量名,不是密钥本身):
moss config set provider openai-compatible
moss config set model your-model-name
moss config set baseUrl https://gw.example
moss config set apiKeyEnv MY_GATEWAY_API_KEY
export MY_GATEWAY_API_KEY=your-key
moss doctor
baseUrl 末尾的 /v1 可写可不写。https://gw.example 和 https://gw.example/v1 都可以。Moss 自己拼接 /v1/chat/completions,不会变成 /v1/v1。不必写 /chat/completions,写了也会被去掉。moss doctor 核对服务商、模型、地址,以及密钥变量是否已设置。
进到交互界面后:
moss "整理这个项目的 README"直接派活;@引用文件,!执行 shellShift+Tab在模式间切换(plan= 只读规划);/plan进入 plan 模式。/mode仍可用一版Ctrl+V粘贴剪贴板图片 / Finder 文件 / 本地路径作为附件(macOS;Linux 用 wl-paste/xclip,Windows 用 PowerShell)/help看键位与命令,/goal <条件>做到为止,/model换模型
不装到 PATH 也能跑 · 一次性模式 · 会话恢复
node dist/cli.js --help # 直接跑构建产物
moss "check disk usage" # 一次性模式(也支持管道:echo "list files" | moss)
moss resume --last # 继续最近一次会话
moss --no-tty # 强制使用 readline REPL
升级
如果 moss 命令还来自旧的未加 scope 的包(包括 npm link),先执行 npm uninstall -g moss。否则新的全局安装会报 EEXIST,而这时 moss --version 看起来可能已经是新的。
npm 全局安装(推荐路径)直接:
npm install -g @rdk-moss/agent@latest
已有源码克隆时,在它的上一级目录运行:
cd moss && git pull && npm ci && npm install -g --install-links .
npm ci 会重新构建。--install-links 把新的副本装进全局 prefix,而不只是重新编译克隆目录。moss --version 带短 commit 和构建日期,例如 moss v0.26.0 (e8dc2e3, 2026-10-10)。构建时工作区有未提交改动会写成 e8dc2e3+dirty。升级前后可以对上。
moss update 按安装方式打印对应命令:npm 全局打印上面的 @latest 一行;找得到克隆就打印克隆升级行;都没有才打印 git clone。全局安装只在当前目录和 ./moss 里找克隆。别的位置用 moss update --dir <克隆> 或 MOSS_SOURCE_DIR。它只打印命令,不执行。
卸载
npm uninstall -g @rdk-moss/agent
这条只卸掉命令。下面的东西会留下:
- 配置:Linux / macOS 是
~/.config/moss(设了XDG_CONFIG_HOME时在那里的moss),Windows 是%APPDATA%\moss。也检查~/.moss - npx 缓存:
~/.moss/cache/npx - 每个项目里的
.moss/(任务、会话、项目配置) - 源码克隆目录
- npm 缓存,一般是
~/.npm - 原生模块缓存:
~/.cache/node-gyp - prefix 里可能留下空的
@rdk-moss目录:Linux / macOS 是$(npm prefix -g)/lib/node_modules/@rdk-moss,Windows 是%APPDATA%\npm\node_modules\@rdk-moss
可以删:~/.moss/cache/npx、~/.cache/node-gyp、npm 缓存(npm cache clean --force)、空的 @rdk-moss 目录,以及你不再需要的克隆目录。删掉 ~/.config/moss、~/.moss 或项目里的 .moss/ 会同时去掉 key、设置和任务记录;只有确定不要这些数据时再删。
板子无法访问外网 / 需要代理
实验室 / 教室里的 RDK 板子常常直连不了 GitHub、npm、Node 镜像和模型网关(TCP 超时)。第一步 git clone 就会卡住。
必设环境变量(正式推荐,仅此):
export HTTPS_PROXY=http://127.0.0.1:1080
export HTTP_PROXY=http://127.0.0.1:1080
export NO_PROXY=localhost,127.0.0.1,::1
# 当前 Moss main(含 O83 / #81 起)会自动让 Node fetch 走上述代理,
# 不必再设 NODE_USE_ENV_PROXY(那是旧 tip 的临时绕过,当前不需要)
端口与是否需要 ssh -R 隧道按现场配置。
板上首装注意:
- git clone: 用
git clone --depth 1 https://github.com/D-Robotics/moss.git;完整 clone 在慢网 / 代理下容易 GnuTLS / early EOF。 - npm: 国内可
npm config set registry https://registry.npmmirror.com;镜像不能代替HTTPS_PROXY——仍需代理才能出网时两者都要。 - Node: 许多 RDK 镜像已带 Node ≥ 22.16;若需 nvm,安装脚本依赖
raw.githubusercontent.com,不出网会超时——优先用系统 Node,或经代理装。 - 用户级 prefix: root 下
npm i -g会写/usr;推荐npm config set prefix "$HOME/.npm-global"并把bin加进 PATH。
如何确认代理生效(必须两条都过):
- 代理日志里有目标模型 / 网关主机的
CONNECT; - 端到端拿到有效回答(
moss -p "…"退出码 0,不是「网络连接失败」)。
仅有 CONNECT、仍报网络失败 = 未过关。 排查时可临时 MOSS_NO_RDK_DOCS=1 做对照;根因修复见 backlog O87(CONNECT 有、回答无),本 README 不替代该项。连接类错误请检查代理 / 防火墙,不要按「换更快的模型」处理。
为什么是 Moss
普通 coding agent 的"完成"是模型说自己完成了。Moss 把这条判定链做成可审计的机器流程:
task_define(目标 + 可机检验收标准)
→ device_deploy / device_exec / run_tests(真实执行)
→ record_evidence(Expected / Observed / Result 结构化证据)
→ task_acceptance(按 metric 匹配最新证据裁决)
- PASS 只能来自 verdict provider(命令裁决 > 契约裁决)——模型散文永远不是事件
- 缺证据 = 未完成;
latest-wins支持修复后复测 - 每个任务走同一个事件驱动状态机:
draft → planning → executing → verifying → diagnosing → repairing → reverifying → accepted | failed - 完成门内置在 agent 里:一次 run 定义了任务却没有验收裁决时,终稿会被拦截一次并注入修正——不会无限劫持
所有工件落在工作区 .moss/,这是可复现、可追踪、可分析的数据基础:
tasks.jsonl · task-events.jsonl · evidence.jsonl · deployments.jsonl · acceptance.jsonl · task-failures.jsonl · task-repairs.jsonl。
能力
写代码。 agent loop 负责轮次控制、上下文压缩与预算、nudge、loop guard;45 个内置工具开箱即用(含 12 个 SSH 设备工具),覆盖读写文件与补丁、代码搜索、进程与后台任务、联网抓取与搜索、类型 / lint 诊断、跑测试与修复验证、子代理、任务契约。写类工具走审批。会话可保存 / 搜索 / 导出 / fork;/compact 压缩历史,/rewind 从检查点撤销文件编辑,/diff 看改动,/review 审查 diff(或某个 GitHub PR)找 bug 与安全问题。
子代理。 create_subagent 派生有 scope 限定的子代理(explore / plan / verify / full),可后台运行、可 fan_out_subagents 并发扇出并聚合摘要;写类子代理可跑在独立 git worktree 里,产物以三方补丁合并回父工作区。
连真机。 用 SSH 直连 RDK / Linux 板卡。只读:device_info · device_processes · device_resources · device_temperature · device_network · device_cameras · device_robotics_status · device_file_read · device_file_list;写类(逐次审批):device_exec · device_file_write · device_deploy。注册成清单后可一条命令做多机只读巡检:
export MOSS_DEVICE_HOST=<board> MOSS_DEVICE_PORT=22 MOSS_DEVICE_USER=root MOSS_DEVICE_PASSWORD=...
moss device add rdk-01 192.168.1.10 --user root --kind rdk
moss device list
moss device test rdk-01
moss device fleet info --devices rdk-01,rdk-02,rdk-03 --concurrency 4
一个真实目标长这样,agent 会从目标里发现该用哪些设备工具,逐条验收标准记录 Expected/Observed/Result 证据:
moss --print "定义任务:相机管线保持 30 FPS 持续 60 秒;部署、运行、记录证据、验收"
板卡手册(烧录、引脚、TROS / hobot_dnn、规格)由内置 rdk-docs MCP 供给,默认钉在 rdk-docs-mcp@0.3.0(BM25 + 标题融合、noGoodMatch、alt_queries、板型过滤;默认命中是 title/url/anchor/snippet,verbose 才带分数;get_page 默认返回匹配的 section,full 才读整页)。默认在后台连接,不需要设备目标(MOSS_DEVICE_HOST 或 .moss/devices.json 都不是前置条件),也不阻塞交互界面。自定义或尚未发布的版本可用 "rdkDocs": {"package": "../rdk-docs-mcp"} 或 MOSS_RDK_DOCS_PACKAGE 指向 npm spec、本地目录或 tarball;该值会作为代码执行,只使用可信来源。MOSS_NO_RDK_DOCS=1、"rdkDocs": false 或 "rdkDocs": {"enabled": false} 关闭;同名 mcp.json 条目整段替换内置项。服务器能力随版本而异,Moss 先查询工具清单再按实际 schema 调用。连不上时本会话不查手册,没有缓存,也没有离线副本。审计与保留标准见 docs/superpowers/plans/2026-10-09-rdk-knowledge-via-mcp.md。
扩展。 MCP 客户端(stdio + streamable HTTP,工具懒加载);轻量 skills(.moss/skills/<name>/SKILL.md,渐进披露,$ARGUMENTS 传参);自定义斜杠命令(.moss/commands/<name>.md);人设(.moss/soul.md);生命周期 hook。
嵌入与自动化。 headless 输出是给脚本 / CI 用的稳定契约;把任务跑到裁决位时,只有 accepted 才退出码 0:
moss --print "summarize this repository"
moss --output-format json "..." # 或 stream-json(system/init → assistant → user → result)
moss task run --goal "创建 hello.txt 内容为 MOSS_OK 并验证内容" --accept "grep -q MOSS_OK hello.txt"
moss task status && moss task timeline
moss tasks list # 只读查看机器人闭环产物
src/index.ts 的导出面是受 semver 保护的合同,由 test/sdk-contract.spec.mjs 快照锁定;examples/ 下三个可运行集成(npm run examples)。
板端推理依赖(RDK)
不要再用
http://sdk.d-robotics.cc:8080/simple/(已下线,连接失败)。
不要再用http(s)://archive.d-robotics.cc/simple/(不是可用的 pip 索引,HTTPS 返回 404)。
按 OS / 板型选接口
| 板型 / 场景 | 应使用 |
|---|---|
RDK X5,RDK OS ≥ 3.5.0(rdk_x5) |
板端自带 hbm_runtime;禁止 pip install hbm_runtime |
RDK X5 历史 demo(rdk_x5_legacy / OS < 3.5.0) |
下方已核实 X5 1.0.3 whl,或板端 hobot_dnn |
| RDK X3 | 下方已核实 X3 1.0.3 whl,或板端 hobot_dnn |
| RDK S 系列 | 板端 hbm_runtime;不要装 X5 的 hobot_dnn |
权威说明:Model Zoo 推理接口参考。
仅 legacy 的 whl(已核实 HTTP 200)
文档里只出现下面两条直链;Moss 不会自动装包。
# X5 legacy
wget -nc https://archive.d-robotics.cc/downloads/rdk_model_zoo/rdk_x5/bpu_infer_lib_x5-1.0.3-py3-none-any.whl
pip install bpu_infer_lib_x5-1.0.3-py3-none-any.whl
# X3
wget -nc https://archive.d-robotics.cc/downloads/rdk_model_zoo/rdk_x3/bpu_infer_lib_x3-1.0.3-py3-none-any.whl
pip install bpu_infer_lib_x3-1.0.3-py3-none-any.whl
缺少 libhbucp.so
多为 pip 覆盖了系统 hobot / hbm 包,或系统 < 3.5.0 却跑新 Model Zoo。禁止 pip install hbm_runtime。优先烧录 ≥ 3.5.0 且自带运行时的镜像;若曾用 pip 覆盖,卸载 pip 副本后 apt 重装 hobot-dnn 并 ldconfig。moss doctor 会警告旧 pip 源,并可选探测上述 whl 是否可达。
命令参考
| 子命令 | 用途 |
|---|---|
moss(或 moss "prompt") |
交互界面 / 一次性模式 |
moss setup · moss auth status|logout |
配置向导 · 查看登录态 / 删除已存 key |
moss doctor(别名 moss status) |
体检配置 / 凭证 / 工作区 / 运行时 |
moss config show|env|init|set|unset|validate |
配置读写;moss config --help 是键的完整参考,moss config env 是环境变量权威清单 |
moss resume · moss fork · moss sessions list|delete|search|export |
会话恢复 / 分叉 / 管理 |
moss task run|resume|status|timeline |
统一任务运行时(目标进 → 已验证结果出) |
moss tasks list|evidence|deployments|acceptance|device |
只读巡检机器人闭环产物 |
moss device add|list|remove|test|fleet |
设备清单与多机只读巡检 |
moss mcp add|list|remove|test |
MCP 服务器管理 |
moss skill create|list |
技能管理 |
moss update |
打印升级命令(npm 全局或 git 克隆);不执行 |
plugins/migrate/web/agent属于已移除的子系统,本构建里会明确报错,不会悄悄 fallback。moss <command> --help仍给出该子命令自己的用法。
日常斜杠命令:/model /compact /goal /plan /review /doctor /diff /permissions /clear /help。Shift+Tab 循环模式;/plan 进入 plan 模式;/goal <条件> 持续工作直到条件满足,/goal clear 取消。/resume 恢复已保存的会话;/tasks 列出后台 shell 与子代理。Esc 中断当前回复;运行中直接发消息会先 steer,无法 steer 时排在输入区上方(↑ 取回编辑)。/mode /steer /queue /loop 保留为隐藏别名一版(/loop 已改为 /goal)。/goal 没带 --accept 时,从工作区已有的测试入口(package.json test、Makefile、pytest、go.mod)给出验收命令候选,找不到就直说,不编造。/stop(别名 /abort)只停本会话启动的后台进程。隐藏的 /task 是 Task OS 入口(status / timeline / resume / view / verify),/task verify 不调模型,只取一次裁决。PASS 只能来自 verdict provider。
常用 flag:
| Flag | 作用 |
|---|---|
-m/--model · --provider · --base-url |
仅本次运行覆盖 |
-C/--cd <dir> · -c/--config k=v |
换工作区 · 覆盖 profile/model/policy |
--read-only · --workspace-write · --full-access |
本次运行的模式覆盖。workspace-write 只约束 Moss 自己的文件工具,shell 没有操作系统沙箱 |
--trust-device |
本进程允许毁灭性设备操作 |
--accept-edits · --ask-for-approval <p> |
审批行为 |
-p/--print · --json · --output-format <f> |
一次性 / 机器可读输出 |
常用环境变量(完整见 moss config env):MOSS_PROFILE · MOSS_WORKSPACE · MOSS_SAFETY_MODE · MOSS_APPROVAL_POLICY · MOSS_MAX_AGENT_TURNS · MOSS_CONTEXT_TOKENS · MOSS_BUDGET_MAX_* · MOSS_DEVICE_* · MOSS_NO_RDK_DOCS。
头号坑:模型相关设置只认配置文件。
MOSS_MODEL/MOSS_PROVIDER/MOSS_BASE_URL/MOSS_API_KEY即使设了也会被忽略——请用moss setup或moss config set。
未指定配置文件时,Moss 读取用户配置,并把工作区 .moss/config.json 当作项目默认值合并进去(用户配置优先)。--config-file 或 MOSS_CONFIG_FILE 只加载那个文件,项目 .moss/config.json 这一层不会进入本次配置。
界面语言
英文是默认界面语言。 中文是完整的可选界面语言,只影响界面文案、帮助、错误和配置向导。助手回复仍跟随用户消息的语言,不跟这个设置走。
moss --lang zh # 仅本次运行
MOSS_LANG=zh moss # 进程环境变量(项目 .env 不能设置)
moss config set language zh # 记在用户配置 ~/.config/moss/config.json
moss config set language auto # 默认:仅当系统区域以 zh 开头时用中文
优先级:--lang > MOSS_LANG > 用户配置 language > 系统区域。C、POSIX、C.UTF-8 不是语言,会落到下一个变量(LC_ALL、LC_MESSAGES、LANG);都不是语言时界面保持英文。项目 .moss/config.json 和项目 .env 不能设置界面语言。
交互界面里 /language(别名 /lang)切换本会话;/language zh save 写入用户配置。系统区域为中文且还没选过时,首次 moss setup 用一行提示:按 e 切换为英语。
安全与隐私
-
v0.26 起默认 full:本地写操作与可逆设备变更跳过逐次询问。毁灭性设备操作(重启、刷机、写入
/boot或/etc、改网络、卸系统包、停掉 ssh)仍要确认——full 对齐的是 Claude Code 的「默认少问」,不是对真机的--dangerously-skip-permissions。 -
四态交互模式(Shift+Tab 循环,或
/plan进入 plan;/mode仍可用一版):模式 行为 manual写操作与设备变更逐次询问 acceptEdits工作区内文件工具编辑自动通过,shell 与设备变更仍询问 plan只读规划,写操作与设备变更被拦 full(默认)本地写与可逆设备操作跳过询问;毁灭性设备操作 TTY 确认、headless 拒绝。deny 规则与本机硬拦截仍生效 -
workspace-write不是操作系统沙箱。workspace-write只约束 Moss 自己的文件工具。终端命令照常运行,没有操作系统沙箱。write_file、edit_file、multi_edit、move_file、apply_patch写在工作区内;exec没有 Landlock、bubblewrap 或 seatbelt。静态扫描会拦下它能看见的一部分出区写(重定向、cp、mv),挡不住子进程里的node/python(例如写入/tmp)。shell 的安全来自输出脱敏和写回防护。可选的操作系统沙箱见docs/design/os-sandbox.md,默认关闭。 -
权限规则(
/permissions,任何模式生效,deny 优先于一切含 full):- 三级
allow/ask/deny,优先级 deny > ask > allow; - 语法
ToolName(pattern),用 moss 原生工具名:/permissions add deny "read_file(./.env)"、/permissions add allow "exec(npm run *)"; - 会话级规则下一个工具调用即生效;
/permissions persist写用户配置重启仍生效; --read-only/MOSS_SAFETY_MODE=read-only是压过任何模式(含 full)的只读上限。
- 三级
-
本机硬拦截永不撤:本机
exec的毁灭性命令(rm -rf /等)与路径逃逸在 full 模式下同样被拦——full 跳过的是询问,不是检查。设备侧的同一类命令不硬拦死:TTY 确认、allow 规则,或显式信任之后会真的执行。 -
显式信任设备(任一即可;deny 仍赢):
--trust-device(仅本进程)、MOSS_DEVICE_TRUST=full、permissions.deviceTrust=full、permissions.trustedDevices或MOSS_DEVICE_TRUST_DEVICES(逗号分隔的 host / device id)。确认框里选a只信任提示里写明的范围(例如同一 unit 的systemctl restart或stop,或同一命令前缀),不是整台设备的全部毁灭性操作。读取/etc/shadow、私钥、sshd_config、authorized_keys归入sensitive:同样要确认,但文案和证据不把它叫成毁灭性修改。确认与拒绝文案跟随界面语言(--lang、MOSS_LANG或用户配置language;否则系统区域以zh开头时为简体中文)。每次决定写入.moss/evidence.jsonl(metric: device_policy),有进行中的任务时同时写入时间线note。策略说明见docs/superpowers/plans/2026-10-09-device-safety-policy.md。 -
旧键兼容(一版宽限):
profile/trustedTools/deniedTools/safetyMode/approvalPolicy读入即按映射表翻译(cautious→manual+只读上限、balanced→manual、autonomous→full、trustedTools→allow 规则、deniedTools→deny 规则),写侧提示 deprecated,新配置请用permissions.*块。 -
凭据只从
.env或环境变量读,绝不硬编码、不进日志、不传子进程、不写设备清单。 -
无账号、无云服务、无遥测;provider 是普通 HTTP 端点。
质量门与基准
npm run check # prettier + eslint(0 warning)+ typecheck
npm run test # build + 全部 test/*.spec.mjs(当前 235 个,面向 dist 跑)
npm run smoke # CLI 冒烟:--version / --help / PTY 启动
npm run verify # check + test + smoke —— 发版前必须全绿
# 真实终端(tmux / GNU screen / Terminal.app),默认不跑;缺哪个终端就跳过哪项
npm run build && MOSS_REAL_TERMINALS=1 npm run test:filter -- --filter tui-real-terminals
基准结果留在 bench/results/(不入库):
npm run bench·npm run bench:ab -- reasoning-high·npm run bench:noise:agent 能力、A/B 与噪声带npm run bench:swe·npm run bench:tb:SWE-bench Verified 锁定子集 · Terminal-Benchnpm run bench:deepswe:DeepSWE v1.1,同一模型下和其他 harness 比(经 Pier 跑,已发布分数在bench/boards/deepswe-v1.1-harness.json)npm run bench:device -- --dry(或--target sim/--target real):RDK 板卡任务成功率。Moss 裁决通过、且独立探测与证据一致才算 PASS,见docs/bench/device-bench.mdnpm run bench:tui-feel:TUI 体感 ·node scripts/task-os-metrics.mjs:Task OS 指标(轮次 / 工具 / 成功率)
版本号表示当前能力级别:main 是滚动线,tag 只在 verify 全绿且 examples/ 实跑通过后打。详见 docs/release-policy.md。
支持矩阵
| 维度 | 支持 | 验证方式 |
|---|---|---|
| Node | ≥ 22.16.0 | CI 双档(22.16 / 24) |
| 平台 | Linux / macOS / Windows | CI 矩阵(Windows 无 PTY smoke) |
| provider | deepseek / qwen / openai / anthropic / openai-compatible | 单测 + 冒烟 |
| 交互面 | TTY:全屏 TUI;非 TTY / MOSS_NO_TUI=1 / Windows:readline REPL |
TUI spec 家族 + PTY smoke |
文档
AGENTS.md—— 架构、分层规则、子系统导航、工程约定(工作合同)docs/release-policy.md—— 一个版本 / tag 声称了什么,又没声称什么docs/capability-layer.md—— MCP / device / skill 能力层docs/design/os-sandbox.md——exec的可选操作系统沙箱(默认关)docs/cli-parity/—— 与 Claude Code / codex 的命令面基线对照;真实终端清单见tui-real-terminals.mddocs/bench/device-bench.md—— 设备任务基准怎么跑、指标怎么算CHANGELOG.md—— 未发版改动docs/superpowers/plans/—— 设计与路线图记录
License
MIT(见 LICENSE)。
Moss — English
English · 中文
One Intent → One Task → One Agent Loop → One Verified Result.
Moss is a minimal, cross-platform coding agent harness and an Agent Task OS for robot development. It turns a sentence of intent into a state-machine task with machine-checkable acceptance criteria, runs it through one agent loop, and refuses to call it done without a verdict backed by recorded evidence. It talks to RDK / Linux robots over SSH, so "done" can mean the board actually did it.
- TypeScript / ESM single package · Node ≥ 22.16.0 · Linux / macOS / Windows
- No account, no cloud service, no telemetry — providers are plain HTTP endpoints
- Four surfaces: full-screen TUI · readline REPL · headless CLI · embeddable SDK
Prerequisites
Check Node first (hard requirement: Node ≥ 22.16.0):
node -v
If Node is missing or too old, install it first (copyable):
- macOS:
brew install node@22, ornvm install 22 && nvm use 22/fnm install 22 && fnm use 22 - Ubuntu / Debian: NodeSource (nodesource/distributions) or the same nvm / fnm commands
- Windows (PowerShell):
winget install OpenJS.NodeJS.LTS - In China:
npm config set registry https://registry.npmmirror.com. For nvm's Node downloads, setNVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
On Node older than 22.16, npm install -g @rdk-moss/agent@latest (and the source-path preinstall / prepare hooks) exits non-zero immediately, prints the detected Node version and copyable upgrade commands (including the success-path npm install -g @rdk-moss/agent@latest), and does not leave a broken global moss. Node 22.16 ships with npm 10. Do not follow npm's notice to upgrade to npm 12: Node 22.16 does not support npm 12.
macOS
Git requires the Xcode Command Line Tools. If git is missing, run xcode-select --install. Moss itself does not need a C compiler, and a failed optional native build of cpu-features still leaves a working moss. If the global prefix is not writable, use the user-level prefix below.
Windows
Install Git for Windows. PowerShell's execution policy can block moss.ps1. Allow scripts for the current user only:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Put %APPDATA%\npm on PATH. That is npm's default global bin directory on Windows.
Quick start
Recommended (one line) when Node ≥ 22.16 is already installed:
npm install -g @rdk-moss/agent@latest
moss --version
moss
If an older unscoped moss package is already installed, run npm uninstall -g moss first. The two packages use the same moss bin, and npm stops with EEXIST. Do not pass --force. It leaves both the old package and @rdk-moss/agent installed, and a later npm uninstall -g moss removes the moss command.
If npm reports EACCES on the global prefix, point prefix at your home directory, or use nvm (Node then lives under your home directory):
npm config set prefix ~/.npm-global
Add ~/.npm-global/bin to PATH and open a new terminal.
Develop from source (optional)
For contributors. npm ci runs prepare (Node check, then npm run build), so there is no separate build step:
git clone https://github.com/D-Robotics/moss.git
cd moss
npm ci
npm install -g --install-links .
moss
npm 11 may print npm warn install-scripts. npm ci may name ssh2 and cpu-features. The following npm install -g --install-links . may also name @rdk-moss/agent (its preinstall and prepare scripts). The warning is harmless: ssh2 works without its optional native addon, and the global copy already contains dist/. Do not run npm audit fix --force. It changes dependency versions and breaks the install.
With no usable config, moss sets itself up in that screen (press a number to pick a provider, or Enter to use a key already in the environment; the value is not shown). The D-Robotics gateway is listed first and preselected (https://ai-api.d-robotics.cc/v1, default model deepseek-flash, key only). To keep the key out of the file, set the provider and then the variable name: moss config set provider d-robotics, then moss config set apiKeyEnv <VAR>. A file that names only apiKeyEnv is not configured: setup asks which provider, and the key is not sent to the default DeepSeek endpoint. Then, in the same session:
look around this folder and tell me what it is
Custom OpenAI-compatible gateway
For a gateway that is not a built-in preset, use openai-compatible. These four commands set the provider, model, address, and the key variable name (apiKeyEnv stores the name, not the secret):
moss config set provider openai-compatible
moss config set model your-model-name
moss config set baseUrl https://gw.example
moss config set apiKeyEnv MY_GATEWAY_API_KEY
export MY_GATEWAY_API_KEY=your-key
moss doctor
A trailing /v1 on baseUrl is optional. Both https://gw.example and https://gw.example/v1 work. Moss appends /v1/chat/completions itself and never produces /v1/v1. Do not include /chat/completions; it is not needed, and Moss strips it if it is present. moss doctor checks the provider, model, address, and whether the key variable is set.
Inside Moss: give it a job (@ to reference files, ! for shell), Shift+Tab to cycle modes
(plan = read-only planning), Ctrl+V to attach a clipboard image / Finder file / local path
(macOS; Linux: wl-paste/xclip; Windows: PowerShell), /help for keys and commands.
Run the build output directly · one-shot mode · resume
node dist/cli.js --help # run the build output
moss "check disk usage" # one-shot (or pipe: echo "list files" | moss)
moss resume --last # continue the latest session
moss --no-tty # force the readline REPL
Upgrade
If the moss command still comes from an older unscoped install, including npm link, run npm uninstall -g moss first. Otherwise a new global install stops with EEXIST even when moss --version already looks new.
npm global install (recommended path):
npm install -g @rdk-moss/agent@latest
From an existing source clone, in the parent of that clone:
cd moss && git pull && npm ci && npm install -g --install-links .
npm ci rebuilds. --install-links installs that new copy into the global prefix, instead of only rebuilding the clone. moss --version includes the short commit and the build date, for example moss v0.26.0 (e8dc2e3, 2026-10-10). A worktree with uncommitted changes at build time is marked e8dc2e3+dirty. The before and after strings differ.
moss update prints the matching command: @latest for an npm global install, the clone upgrade line when it finds a checkout, and git clone only when neither applies. A global install only looks for a checkout in the current directory and in ./moss. Point it somewhere else with moss update --dir <clone> or MOSS_SOURCE_DIR. It prints the commands and does not run them.
Uninstall
npm uninstall -g @rdk-moss/agent
That removes the command. These stay behind:
- Config:
~/.config/mosson Linux and macOS ($XDG_CONFIG_HOME/mosswhen that variable is set), or%APPDATA%\mosson Windows. Also check~/.moss - The npx cache:
~/.moss/cache/npx - Per-project
.moss/directories (tasks, sessions, project config) - The source clone
- The npm cache, usually
~/.npm - The native-build cache:
~/.cache/node-gyp - An empty
@rdk-mossdirectory left under the prefix:$(npm prefix -g)/lib/node_modules/@rdk-mosson Linux and macOS, or%APPDATA%\npm\node_modules\@rdk-mosson Windows
Safe to delete: ~/.moss/cache/npx, ~/.cache/node-gyp, the npm cache (npm cache clean --force), that empty @rdk-moss directory, and the clone once you no longer need the source. Deleting ~/.config/moss, ~/.moss, or a project's .moss/ also removes keys, settings, and task history. Delete those only when you want that data gone.
Board has no outbound network / proxy setup
Lab and classroom RDK boards often cannot reach GitHub, npm, Node mirrors, or the model gateway directly (TCP timeouts). The first git clone hangs.
Required environment variables (official recommendation — these only):
export HTTPS_PROXY=http://127.0.0.1:1080
export HTTP_PROXY=http://127.0.0.1:1080
export NO_PROXY=localhost,127.0.0.1,::1
# Current Moss main (O83 / #81 onward) routes Node fetch through these proxies
# automatically. Do NOT set NODE_USE_ENV_PROXY — that was a temporary workaround
# on older tips and is not needed now.
Port and whether you need an ssh -R tunnel depend on your site.
First install on a board:
- git clone: use
git clone --depth 1 https://github.com/D-Robotics/moss.git. A full clone often fails with GnuTLS / early EOF on slow or proxied links. - npm: in China you may
npm config set registry https://registry.npmmirror.com. A registry mirror does not replaceHTTPS_PROXYwhen the board still needs a proxy to leave the LAN. - Node: many RDK images already ship Node ≥ 22.16. nvm’s install script needs
raw.githubusercontent.comand will time out offline — prefer the system Node, or install via the proxy. - User-level prefix:
npm i -gas root writes under/usr. Prefernpm config set prefix "$HOME/.npm-global"and put thatbinon PATH.
How to confirm the proxy works (both required):
- The proxy log shows
CONNECTto the model / gateway host; and - End-to-end you get a successful answer (
moss -p "…"exits 0 — not “network connection failed”).
CONNECT alone with a network failure is a FAIL. For triage you can temporarily set MOSS_NO_RDK_DOCS=1. Root-cause work for “CONNECT without an answer” is backlog O87; this README does not replace that item. Treat connection errors as proxy / firewall issues — not “switch to a faster model”.
Why Moss
A normal coding agent's definition of done is the model saying so. Moss makes that judgement an auditable machine process:
task_define (goal + machine-checkable acceptance criteria)
→ device_deploy / device_exec / run_tests (real execution)
→ record_evidence (structured Expected / Observed / Result)
→ task_acceptance (evaluate against the latest evidence per metric)
- PASS can only come from a verdict provider (command verdict > contract verdict) — model prose is never an event.
- Missing evidence = not done;
latest-winssupports re-verification after a repair. - Every task runs the same event-sourced state machine:
draft → planning → executing → verifying → diagnosing → repairing → reverifying → accepted | failed. - The acceptance gate is built in: a run that defined a task but produced no verdict gets its final answer intercepted once and corrected — it does not hijack indefinitely.
Artifacts land in the workspace .moss/: tasks.jsonl · task-events.jsonl · evidence.jsonl ·
deployments.jsonl · acceptance.jsonl · task-failures.jsonl · task-repairs.jsonl.
Capabilities
Coding. Turn control, context compaction and budgets, nudges, loop guards, and 45 built-in
tools (incl. 12 SSH device tools) covering files and patches, code search, processes and
background jobs, web, diagnostics, tests, sub-agents, and the task contract; mutating tools go
through approval. Sessions are saved, searchable, exportable, forkable; /compact, /rewind,
/diff, /review.
Sub-agents. create_subagent with scoped children (explore / plan / verify / full),
background runs, fan_out_subagents with aggregated summaries, and worktree-isolated writers
merged back via 3-way patch.
Robots (RDK first). Read-only device_info · device_processes · device_resources ·
device_temperature · device_network · device_cameras · device_robotics_status ·
device_file_read · device_file_list; approved mutations device_exec · device_file_write ·
device_deploy. Register a fleet and fan out:
export MOSS_DEVICE_HOST=<board> MOSS_DEVICE_PORT=22 MOSS_DEVICE_USER=root MOSS_DEVICE_PASSWORD=...
moss device add rdk-01 192.168.1.10 --user root --kind rdk
moss device fleet info --devices rdk-01,rdk-02,rdk-03 --concurrency 4
moss --print "define a task: camera pipeline keeps 30 FPS for 60s; deploy, run, record evidence, accept"
Board manuals (flashing, pinouts, TROS / hobot_dnn, specs) come from the built-in rdk-docs MCP,
defaulting to the pinned rdk-docs-mcp@0.3.0 (BM25 + title fusion, noGoodMatch, alt_queries,
and board filtering; default hits are title, url, anchor, and snippet, with scores only when
verbose; get_page returns the matching section unless full). Moss connects it in the background by default, with or
without a device target (MOSS_DEVICE_HOST or .moss/devices.json is not required),
so a cold npx download does not block the interactive shell. To test an unpublished build, set
"rdkDocs": {"package": "../rdk-docs-mcp"} or MOSS_RDK_DOCS_PACKAGE to an npm spec, local
directory, or tarball. Overrides execute code; use only trusted sources. MOSS_NO_RDK_DOCS=1,
"rdkDocs": false, or "rdkDocs": {"enabled": false} turns it off. A same-named mcp.json entry
replaces the builtin. Tool features vary by package version, so Moss discovers names and schemas
before use. If the server cannot be reached, this session does not look up manuals — there is no
cache or offline copy. See docs/superpowers/plans/2026-10-09-rdk-knowledge-via-mcp.md.
Extensibility. MCP client (stdio + streamable HTTP, lazy tool loading), lightweight skills
(.moss/skills/<name>/SKILL.md, $ARGUMENTS interpolation), custom slash commands
(.moss/commands/<name>.md), persona (.moss/soul.md), lifecycle hooks.
Embedding. Headless output is a stable contract for scripts and CI; a task's exit code is 0 only when accepted:
moss --print "summarize this repository"
moss --output-format json "..." # or stream-json (system/init → assistant → user → result)
moss task run --goal "create hello.txt containing MOSS_OK and verify its content" --accept "grep -q MOSS_OK hello.txt"
moss task status && moss task timeline
moss tasks list # read-only robotics artifacts
The src/index.ts export surface is a semver-protected contract, snapshotted by
test/sdk-contract.spec.mjs; three runnable integrations live in examples/ (npm run examples).
Board-side inference dependencies (RDK)
Do not use
http://sdk.d-robotics.cc:8080/simple/(offline; connection refused).
Do not usehttp(s)://archive.d-robotics.cc/simple/(not a working pip index; HTTPS returns 404).
Pick the interface by OS / board
| Board / scenario | Use |
|---|---|
RDK X5, RDK OS ≥ 3.5.0 (rdk_x5) |
Board-bundled hbm_runtime; never pip install hbm_runtime |
RDK X5 legacy demos (rdk_x5_legacy / OS < 3.5.0) |
Verified X5 1.0.3 whl below, or board hobot_dnn |
| RDK X3 | Verified X3 1.0.3 whl below, or board hobot_dnn |
| RDK S series | Board hbm_runtime; do not install X5 hobot_dnn |
Official reference: Model Zoo infer API.
Legacy whl only (verified HTTP 200)
Only these two direct URLs appear in Moss docs. Moss will not auto-install packages.
# X5 legacy
wget -nc https://archive.d-robotics.cc/downloads/rdk_model_zoo/rdk_x5/bpu_infer_lib_x5-1.0.3-py3-none-any.whl
pip install bpu_infer_lib_x5-1.0.3-py3-none-any.whl
# X3
wget -nc https://archive.d-robotics.cc/downloads/rdk_model_zoo/rdk_x3/bpu_infer_lib_x3-1.0.3-py3-none-any.whl
pip install bpu_infer_lib_x3-1.0.3-py3-none-any.whl
Missing libhbucp.so
Usually a pip overlay of system hobot / hbm packages, or OS < 3.5.0 running a new Model Zoo. Do not pip install hbm_runtime. Prefer an image ≥ 3.5.0 with the board-bundled runtime; if pip overwrote packages, uninstall the pip copies, reinstall hobot-dnn via apt, and run ldconfig. moss doctor warns on deprecated pip indexes and can optionally probe the whl URLs above.
Command reference
| Subcommand | Purpose |
|---|---|
moss (or moss "prompt") |
Interactive shell / one-shot |
moss setup · moss auth status|logout |
Setup wizard · check or clear stored credentials |
moss doctor (alias moss status) |
Health-check config / credentials / workspace / runtime |
moss config show|env|init|set|unset|validate |
Config I/O; moss config --help lists every key, moss config env is the env list |
moss resume · moss fork · moss sessions list|delete|search|export |
Resume / fork / manage sessions |
moss task run|resume|status|timeline |
Unified task runtime (intent in → verified result out) |
moss tasks list|evidence|deployments|acceptance|device |
Read-only robotics artifacts |
moss device add|list|remove|test|fleet |
Device registry + read-only fleet probe |
moss mcp add|list|remove|test |
MCP server management |
moss skill create|list |
Skill management |
moss update |
Print the upgrade command (npm global or git clone); it does not run it |
plugins/migrate/web/agentbelong to removed subsystems and fail loudly in this build rather than silently falling back to chat.moss <command> --helpis that command's own usage.
Everyday slash commands: /model /compact /goal /plan /review /doctor /diff
/permissions /clear /help. Shift+Tab cycles modes; /plan enters plan mode; /goal <condition>
works until the condition is met and /goal clear cancels it. /resume restores a saved
conversation; /tasks lists background shell jobs and sub-agents. Esc interrupts the current
reply; a message typed during a run steers it, and queues above the composer when steering is
refused (Up edits that queue). /mode /steer /queue /loop stay as hidden aliases for one
version (/loop is now /goal). Without --accept, /goal proposes acceptance commands from
test entry points that exist in the workspace (package.json test, Makefile, pytest, go.mod)
and says so when it finds none. /stop (alias /abort) stops only background processes this
session started. The hidden /task is the Task OS entry (status / timeline / resume / view /
verify); /task verify takes one verdict without a model turn. A PASS still comes only from the
verdict provider.
Key flags: -m/--model, --provider, --base-url, -C/--cd, -c/--config k=v,
--read-only · --workspace-write · --full-access (workspace-write confines Moss's own file tools; shell commands run normally without an OS sandbox), --trust-device, --accept-edits,
--ask-for-approval <p>, -p/--print, --json, --output-format <f>.
Key env vars (full list: moss config env): MOSS_PROFILE · MOSS_WORKSPACE ·
MOSS_SAFETY_MODE · MOSS_APPROVAL_POLICY · MOSS_MAX_AGENT_TURNS · MOSS_CONTEXT_TOKENS ·
MOSS_BUDGET_MAX_* · MOSS_DEVICE_* · MOSS_NO_RDK_DOCS.
Gotcha: model settings are config-only.
MOSS_MODEL/MOSS_PROVIDER/MOSS_BASE_URL/MOSS_API_KEYare read but ignored — usemoss setupormoss config set.
Without an explicit file, Moss reads the user config and merges .moss/config.json from the
workspace as project defaults (the user file wins). --config-file or MOSS_CONFIG_FILE loads
only that file, so the project .moss/config.json layer is not part of the run.
UI language
English is the default UI language. Chinese is a complete, optional UI language. It covers chrome, help, errors, and setup text. Assistant replies still follow the language of the user's message.
moss --lang zh # this run only
MOSS_LANG=zh moss # process env (a project .env cannot set this)
moss config set language zh # user config ~/.config/moss/config.json
moss config set language auto # default: Chinese only when the locale starts with zh
Precedence: --lang > MOSS_LANG > user config language > system locale. Neutral tags
(C, POSIX, C.UTF-8) are not a language and fall through to the next of LC_ALL,
LC_MESSAGES, and LANG. If none names a language, the UI stays English. A project
.moss/config.json and a project .env cannot set the UI language.
In the shell, /language (alias /lang) switches the session. /language zh save writes the
user config. On a Chinese system locale that has not chosen yet, the first moss setup offers
one line: press e to switch to English.
Safety and privacy
-
Full by default since v0.26: local writes and reversible device changes skip the prompt. Destructive device operations (reboot, flashing, writes to
/bootor/etc, network changes, removing system packages, stopping ssh) still confirm. Full matches Claude Code's "ask less by default", not--dangerously-skip-permissionsagainst a robot board. -
Four interaction modes (Shift+Tab cycles, or
/planto enter plan mode;/moderemains for one version):Mode Behavior manualmutations and device changes ask one by one acceptEditsworkspace file-tool edits auto-approve; shell and device changes still ask planread-only planning; mutations and device changes blocked full(default)local writes and reversible device work skip the prompt; destructive device work confirms on a TTY and is refused headless. Deny rules and host hard blocks still apply -
workspace-writeis not an OS sandbox. workspace-write confines Moss's own file tools. Shell commands run normally without an OS sandbox.write_file,edit_file,multi_edit,move_file, andapply_patchstay inside the workspace.execis not wrapped in Landlock, bubblewrap, or seatbelt. A static scan rejects some out-of-workspace shell writes it can see (redirections,cp,mv); a childnodeorpythonprocess can still write outside, for example under/tmp. Shell safety is output redaction and write-back guards. An opt-in OS sandbox is specified indocs/design/os-sandbox.mdand stays off. -
Permission rules (
/permissions, effective in any mode, deny beats everything incl. full):- three levels
allow/ask/deny, priority deny > ask > allow; - syntax
ToolName(pattern)with moss-native tool names:/permissions add deny "read_file(./.env)",/permissions add allow "exec(npm run *)"; - session rules take effect on the next tool call;
/permissions persistwrites the user config and survives restarts; --read-only/MOSS_SAFETY_MODE=read-onlyis a read-only ceiling that compresses any mode including full.
- three levels
-
Host hard blocks never lift: destructive host
execcommands (rm -rf /…) and path escapes stay blocked in full mode — full skips the asking, not the checking. The same shapes on the device are not a permanent hard block: a TTY confirmation, an allow rule, or explicit trust runs them for real. -
Trust a device (any one; deny rules still win):
--trust-device(this process only),MOSS_DEVICE_TRUST=full,permissions.deviceTrust=full, orpermissions.trustedDevices/MOSS_DEVICE_TRUST_DEVICES(comma-separated host or device id). Answeringatrusts only the scope named in the prompt (for examplesystemctl restartorstopof that unit, or the same command prefix) until the session ends. Reading/etc/shadow, private keys,sshd_config, orauthorized_keysis asensitivetier: it still confirms, and the copy does not call it destructive. Prompts and refusals follow the UI language (--lang,MOSS_LANG, or the user configlanguage; otherwise Simplified Chinese when the system locale starts withzh). Every decision is appended to.moss/evidence.jsonl(metric: device_policy) and, when a task is in progress, to its timeline as anote. Policy:docs/superpowers/plans/2026-10-09-device-safety-policy.md. -
Legacy keys (one release of grace):
profile/trustedTools/deniedTools/safetyMode/approvalPolicyare translated on read (cautious→manual+read-only ceiling, balanced→manual, autonomous→full, trustedTools→allow rules, deniedTools→deny rules); writing them prints a deprecation notice — use thepermissions.*block for new config. -
Credentials come only from
.envor the environment: never hardcoded, never logged, never passed to child processes, never written to the device registry. No account, no cloud, no telemetry.
Quality gates and benchmarks
npm run check # prettier + eslint (0 warning) + typecheck
npm run test # build + every test/*.spec.mjs (235 specs, run against dist/)
npm run smoke # CLI smoke: --version / --help / PTY startup
npm run verify # check + test + smoke — required before any release
# Real terminals (tmux / GNU screen / Terminal.app); off by default, missing terminals are skipped
npm run build && MOSS_REAL_TERMINALS=1 npm run test:filter -- --filter tui-real-terminals
Benchmarks stay out of git in bench/results/:
npm run bench·npm run bench:ab -- reasoning-high·npm run bench:noise: agent capability, A/B, noise bandnpm run bench:swe·npm run bench:tb: locked SWE-bench Verified subset · Terminal-Benchnpm run bench:deepswe: DeepSWE v1.1 with the model held fixed against other harnesses (runs through Pier; published scores inbench/boards/deepswe-v1.1-harness.json)npm run bench:device -- --dry(or--target sim/--target real): RDK board-task success rate. A row passes only when Moss's verdict passes and an independent probe matches the evidence — seedocs/bench/device-bench.mdnpm run bench:tui-feel: TUI feel ·node scripts/task-os-metrics.mjs: Task OS metrics (turns / tools / success rate)
A version number states the current capability level: main is the rolling line, tags are cut
only after verify is green and examples/ pass for real — see
docs/release-policy.md.
Support matrix
| Dimension | Supported | Verified by |
|---|---|---|
| Node | ≥ 22.16.0 | CI matrix (22.16 / 24) |
| Platform | Linux / macOS / Windows | CI matrix (no PTY smoke on Windows) |
| Providers | deepseek / qwen / openai / anthropic / openai-compatible | unit tests + smoke |
| Surfaces | TTY: full-screen TUI; non-TTY / MOSS_NO_TUI=1 / Windows: readline REPL |
TUI specs + PTY smoke |
Documentation
AGENTS.md (architecture and conventions) ·
docs/release-policy.md ·
docs/capability-layer.md ·
docs/design/os-sandbox.md (opt-in OS sandbox for exec, default off) ·
docs/cli-parity/ (real-terminal checklist:
tui-real-terminals.md) ·
docs/bench/device-bench.md ·
CHANGELOG.md ·
docs/superpowers/plans/.
License
MIT — see LICENSE.