orrery
AGENTS.md37 starsChanged 37 days agoMITView on GitHub
个人 Agent 驾驶舱(Tauri 2):跨 harness 会话中枢 + 本地模型代理。先自用,后开源。
- Installs packages
The file
Files
AGENTS.md — Orrery
项目是什么
个人 Agent 驾驶舱(Tauri 2):跨 harness 会话中枢 + 本地模型代理。先自用,后开源。
当前状态
- 阶段 0B:
npm run dev桌面窗口已跑通(2026-09-14),Claude Code 会话真扫 + 磁盘占用统计 - 前端:
ui/(index.html+styles.css+app.js,浏览器 mock / Tauri invoke 双模式) - 真实扫描:Claude Code、Kimi Code、DSH(DeepSeek)、Codex、OpenCode、Z Code、Antigravity、WorkBuddy、StepCode 九家。Z Code(
zcode.rs,只读,用量以model_usage为准、逐行按computed_total_tokens判断缓存是否已含在 input 里);Antigravity(antigravity.rs,库只读打开;删除只移走对话自己的文件、不写 agy 的摘要库,正在打开的对话看presence/<id>.lock能否读取,每个对话一个 SQLite,用量从gen_metadata的 protobuf 按字段号解出,cache_read 与 input 分开记);OpenCode 删除只经官方opencode session delete,回收站模式先opencode export到~/.orrery/exports/。另有通用适配器custom.rs,读~/.orrery/harnesses.json登记的 OpenCode 系工具(只读、不支持删除与恢复)。WorkBuddy(workbuddy.rs,2026-09-27 接入)只读:~/.workbuddy/projects/<压缩工作目录>/<sessionId>.jsonl一行一个 item,cwd直接写在每个 item 上(项目路径无损,不像 Claude Code 要解有损目录名)、标题取ai-title那条的aiTitle、用量按providerData.messageId去重(一次请求会拆成 message/function_call/reasoning 多个 item 共用同一份用量)、正在运行的会话读~/.workbuddy/sessions/<pid>.json判活(复用cleanup::guard::pid_alive);删除未开放,它是 Electron 应用、没有可调用的终端 CLI 所以也不做恢复。不要把未公开工具的目录名/表结构写进仓库,那属于用户本地配置。StepCode(stepcode.rs,2026-10-09 接入)可删可恢复:~/.stepcode/agent/sessions/--<编码后的 cwd>--/<ISO 时间戳>_<sessionId>.jsonl,目录名把:\/全变成-(有损),精确 cwd 取首行{"type":"session",…,"cwd":…};用量取 assistant 条目的message.usage四个桶(互不重叠,totalTokens恰等于四桶之和,599/599 条),compaction/branch_summary的 usage 计入,toolResult里子 agent 的 usage 不计(子 agent 各有会话文件,折进来会双倍);标题优先session_info.name(/name设的显示名),否则第一条真实用户输入(跳过<system-reminder>这类注入块);子 agent 会话按时间包含关系折进父会话(格式里没有父 id,parentSession只在/fork场景出现),匹配不上的按kind = "subagent"单独列出;删除就是删 jsonl,没有要清理的文本索引;恢复只能是step --session <jsonl 绝对路径>(按 id 恢复官方不支持,--session <uuid>/--resume <uuid>/--session-id <uuid>全部找不到,实测记录见resume.rs头部),路径由后端stepcode::session_file反查,找不到返回session_file_missing;状态一律idle(StepCode 没有活会话登记处)。逐会话对账脚本scripts/verify-stepcode.mjs - 模型代理:
src-tauri/src/proxy/已能真实转发(OpenAI / Anthropic 两种 wire、SSE 透传、应用内启停);真实供应商联调已通过(作者本机,2026-09) - 会话转换:
src-tauri/src/transfer/,每家一个读取器 + 每个目标一个写入器,中间是Transcript;现开放 Claude Code、Codex、OpenCode 三家互转。保真标准:不悄悄丢内容。未知记录类型、PDF、链接形式的图片一律拒绝;目标放不下的图片(工具结果里的截图、要进 Codex 的图片)由transfer/media.rs存成~/.orrery/transfer-media/<转换>/下的文件、原位置留路径(owner.json记归属,经 Orrery 删除目标会话时一并处理),转换前经只读的preview_transfer告知张数;工具记录在目标里是带来源标记的历史文本。新增来源/目标前必须:真实会话只读试跑(real_sessions_dry_run)+ 沙盒端到端测试 + 目标工具实际恢复并把历史送进回环假供应商(scripts/verify-*-transfer.mjs;存成文件的图片由scripts/verify-transfer-media.mjs验证目标工具能按路径打开并把图片送回模型)。细节见docs/01-架构与技术路线.md - 解析索引:
~/.orrery/index.json落盘,冷启动 188 个会话 5.5s → 0.12s - 在终端恢复:
src-tauri/src/resume.rs,各家各自的恢复命令见该文件头部表格;Windows 上找可执行文件必须.exe/.cmd优先于无扩展名(npm 的 bash shim 会假装启动成功)- 落地页:site/index.html(单文件,三语,无第三方字体/统计脚本;下载按钮运行时读 GitHub 最新 release 并按系统推荐),.github/workflows/pages.yml把site/与.github/assets/拼成站点发布到 https://arvelvale.github.io/orrery/ 。页面上的能力说法(含工具能力矩阵TOOLS)必须与 README「What works today」一致,改功能时一并改。功能截图site/img/*.{en,zh-CN,ja}.png是按界面元素边界截的局部(mock 数据,截图时隐藏外框与相邻元素)。迁移 / 清理 / 代理三块功能卡是脚本渲染的交互演示(示例数据,真实截图留在卡片右上角的「应用截图」页签);它们复述了应用里的规则(迁移时哪些图片存成文件、清理跳过最近 10 分钟有写入的会话并先备份索引、代理只听回环地址),改这些规则时演示要一并改。页面是深色“夜间观测站”基调(应用窗口和三个演示保持应用自己的浅色,放在深色上反差最强),首屏是太阳系仪:每个支持的工具一颗行星,颜色取自应用顶栏的状态灯;字体自托管在site/fonts/(Geist + 思源黑体 SC/JP 子集,SIL OFL,许可证随附),改了页面文案要跑scripts/build-site-fonts.mjs重新生成子集,否则新字会回退到系统字体。中日文标题不要套西文的负字距。动效一律尊重prefers-reduced-motion(减弱时直接给最终状态),循环类动效(打字、数据包)只在看得见时运行 - 发版:打
v*tag → GitHub Actions 三平台出包(Windows msi/nsis、macOS universal dmg、Linux deb/rpm/AppImage)→ 进草稿 release,人工确认再公开。改版本号要同时改package.json/tauri.conf.json/Cargo.toml+Cargo.lock,再打 tag - macOS / Linux 的包只有 CI 验证过(clippy + 测试),没有人在真机上跑过应用,README 里如实标注了这点
- token 口径:主 agent + 子 agent,按 API 调用去重求和(CC 按 message.id 保留最后一行;Kimi 每条 usage.record 即一次调用;DSH 只读 v3 日志;Codex 以 token_usage_record 为准、之前时段累加去重后的 token_count.last,输入要减缓存命中)。每接一个新 harness 都要用独立脚本逐会话对账后再宣布完成。字段对照写在
src-tauri/src/adapters/mod.rs的TokenUsage注释里,改口径先改那张表
约束
- UI 对齐
DESIGN.md;状态灯语义固定(绿 run / 蓝 idle / 琥珀 warn / 灰 off)。 - 浏览器预览可 mock;Tauri 路径必须走
invoke,失败要有可见提示。 - 代理密钥(2026-09 产品决策):用户可在应用内填写 API Key,明文保存在
~/.orrery/proxy.json;仍可用环境变量名回退。解析顺序:api_key非空优先,否则读api_key_env。状态列表只显示「是否已设置 / 来源」,不展示密钥原文;编辑接口(get_proxy_config)仅本机 IPC。仓库与日志仍禁止提交真实密钥。模型/供应商由用户在 UI 登记,不再依赖硬编码列表。代理只听回环地址;调用方鉴权头一律丢弃并按目标供应商重建。 - 提交信息用英文(公开仓库便于国际化;历史已从中文改写为英文)。仓库:https://github.com/arvelvale/orrery(公开,MIT);README 英文为默认,改 README 时三语(README.md / README.zh-CN.md / README.ja.md)同步。
docs/是设计文档正本(作者本机的笔记库以目录链接挂载到这里,路径不入库)。- README 截图用 mock 数据(无头 Edge 截
npm run preview?lang=<locale>页面,三语各一套screenshot-*.{en,zh-CN,ja}.png),不要用真实会话截图——会暴露会话标题与项目路径。 - 界面文案一律走
ui/i18n.js的t(),新增键三种语言同时写(控制台[i18n] missing keys会报缺失);Rust 后端只返回原始数据(时间戳、空标题),不产出任何自然语言。 ui/app.js的 mock 会话必须是虚构项目(acme-web、weather-cli…),不得出现真实项目名或本机路径。- 加平台专有调用前先想清楚另外两个平台:
Command::new("tasklist")这类在别的平台上只是执行失败返回空值,编译和测试都不报错,靠它做判断的逻辑会静默失效(删除保护就踩过)。三平台分支写全,或者显式降级并说明。 - 改
SessionSummary/Rollout的字段就要 bumpadapters/index.rs的INDEX_VERSION:索引按这个版本号判断能不能用,忘了 bump 会读出半截旧数据。索引只是缓存,坏了直接整份丢弃重建,任何情况下都不允许它让会话列表出错。 - 删除功能是破坏性操作:改
cleanup.rs前先读模块顶部的安全约束;验证只在沙盒做(调试构建设ORRERY_HOME指向沙盒主目录),不对真实会话调用delete_sessions;前后对真实目录做快照比对。
常用命令
# 浏览器预览
npm run preview # http://127.0.0.1:1420;app.js 是 ES module,直接双击 index.html(file://)不会运行
# 桌面(需 Rust + npm i)
cd orrery
npm install
npm run dev文档入口
- 定位:
docs/00-项目定位.md - 架构:
docs/01-架构与技术路线.md - 路线:
docs/02-MVP路线图.md
实测手段
- 桌面窗口自动化:启动前设
WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS=--remote-debugging-port=9223 --remote-allow-origins=http://127.0.0.1:9223,再用 CDP(/json/list→ WebSocket)读 DOM、截图。 tauri dev无 devUrl 时由内置服务器在127.0.0.1:1430提供ui/,浏览器打开同地址即 mock 模式。app.js是 ES module,state等不在 window 上,自动化时走 DOM 或window.__TAURI__.core.invoke。
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

