oh-my-openagent(OmO)统一 Agent 状态目录:`~/.omo/agent` 的解析规则、legacy 迁移与 QA 验证
oh-my-openagentOmO统一 Agent 状态目录~/.omo/agent的解析规则、legacy 迁移与 QA 验证【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent导读本文基于 .omo/evidence/20260814-omo-agent-dir-unification/README.md 这一 QA 证据记录系统讲解 oh-my-openagentOmO命令名omo如何将引擎状态目录收敛为唯一的规范位置HOME/.omo/agent包括环境变量解析优先级、launcher 向引擎注入目录的完整链路、从旧扁平布局HOME/.omo的一次性安全迁移carry-forward以及该特性在真实引擎与捕获桩capture stub两种表面上的验证方法与结论。读完本文你将掌握 OmO 状态目录的解析与覆盖规则、迁移的幂等与不覆写保证以及如何用隔离 HOME 的沙箱脚本验证这类启动期行为。为什么需要唯一目录三个入口、三个默认值的历史问题在统一之前OmO 的每个入口各自携带一份默认目录解析逻辑——发布版 launcher、omo doctor、omo setup以及本地安装的 launcher 各自决定引擎状态放哪里。结果就是同一个产品会因启动方式不同而读取三个不同的目录当某一次更新只改了其中一个默认值时用户看到的现象就是设置被清空了尽管数据其实原封未动地躺在另一个目录里。这段动机直接写在该特性的唯一实现文件中packages/omo-native/bin/lib/agent-dir.js 的模块注释明确声明The one place that answers where does omo keep engine state——每一个 OmO 入口都必须通过该模块解析目录。统一目录的核心目标就是无论从哪个入口启动、无论是否设置了环境变量最终解析出的引擎状态目录始终是同一个。核心机制一规范目录解析canonicalAgentDir解析顺序三个环境变量 一个默认值目录解析的唯一实现是canonicalAgentDir()agent-dir.js它按固定优先级处理三个环境变量优先级环境变量说明1最高OMO_CODING_AGENT_DIR当前品牌OmO的显式目录2SENPI_CODING_AGENT_DIR引擎 senpi 的 legacy 名称向后兼容3PI_CODING_AGENT_DIR更早期的名称继续保留以兼容旧脚本4兜底—默认规范位置HOME/.omo/agent其行为细节显式覆盖优先只要某个变量有非空值就使用resolve(configured)解析后的绝对路径不再看后面任何变量空白值视为未设置env[name]?.trim()之后为空则跳过回落到下一个变量乃至默认值默认目录固定defaultAgentDir(home)返回join(home, .omo, agent)agent-dir.js运行时 HOME 优先于系统 homedirruntimeHome()依次取env.HOME || env.USERPROFILE || homedir()agent-dir.js保证 Windows 下通过环境变量携带的运行时 home 优先于os.homedir()。上述优先级、空白值回落、品牌名优先于 legacy 名的行为全部有单元测试逐一锁定见 packages/omo-native/test/agent-dir.test.ts。全入口统一谁在用 canonicalAgentDir通过代码搜索可以确认以下所有入口与工具模块都已改为经由agent-dir.js解析不再各自维护默认值launcherpackages/omo-native/bin/lib/launcher.js启动引擎前调用canonicalAgentDir(env)doctorpackages/omo-native/bin/lib/doctor.jssetup 检测链路setup-detect.js、setup-detect-cache.js、setup-detect-refresh.js、setup-import.js均导入canonicalAgentDir编译入口packages/omo-native/compile-entry.ts。这意味着统一目录不是 launcher 单点的行为而是整个产品的全局约束。核心机制二launcher 如何把目录交给引擎在 launcher.js 的senpiEnvironment()中解析结果被同时注入两个环境变量交给引擎进程const agentDir canonicalAgentDir(env) env.OMO_CODING_AGENT_DIR agentDir env.SENPI_CODING_AGENT_DIR agentDir这段代码注释解释了同时设置两个名字的原因legacy 名称也一并传递这样由工具直接 spawn 出来的裸 senpi 进程会继承同一份状态目录而不是回落到它自己的默认位置——这正是一致性的关键。除此之外senpiEnvironment()还注入了OMO_NATIVE1用于 OmO Native 品牌标识、SENPI_RUNTIMEbun 或 node避免引擎二次决策运行时、SENPI_BRANDJSON 品牌画像含configDir: .omo与flatLayout: false见 launcher.js、OMO_BIN保证按名解析产品时重新进入 launcher等。品牌画像中configDir: .omo与flatLayout: false正是 QA 记录中 capture stub 捕获到的两个字段。核心机制三legacy 扁平布局的一次性迁移adoptLegacyFlatState统一目录最大的风险是看起来像一次重置老用户的引擎状态此前直接散落在HOME/.omo/settings.json扁平布局即引擎状态直接写在配置目录下legacyFlatAgentDir()返回join(home, .omo)。因此agent-dir.js提供了adoptLegacyFlatState()在首次启动时把旧状态搬运进规范目录。迁移的六个规则从 adoptLegacyFlatState 的实现可以归纳出严格的行为契约只在默认目录生效如果canonicalAgentDir()因为用户设置了环境变量而指向别处迁移直接跳过——用户亲手 pin 的目录绝不被触碰第 98-99 行允许列表搬运只迁移settings.json、auth.json、models.json、models-store.json、mcp.json、trust.json六个小型配置文件ADOPTED_STATE_FILESagent-dir.jssessions、caches、logs 留在原地避免启动变成无界拷贝已存在文件不覆盖目标文件已存在时除settings.json走 backfill 外其余一律不动settings 只做缺口回填backfillbackfillSettings()计算 legacy 文件有、canonical 文件没有的顶层 key只合并这些缺失键agent-dir.js。canonical 永远是更新的真相flat 只负责补洞回填前先把 canonical 备份为settings.json.bak-ISO 时间戳幂等 标记迁移完成后写入标记文件.adopted-from-omo-flatADOPTION_MARKERagent-dir.js后续启动见到标记即跳过绝不重复迁移坏 JSON 不阻塞启动legacysettings.json无法解析时readJsonFile()返回undefined本次跳过迁移且不写标记——用户修复文件后下次启动仍会补迁移任何情况下启动都不会被一份手改坏的配置文件卡死agent-dir.js。launcher 在启动路径上调用它并输出提示reportLegacyFlatAdoption() 会在result.adopted为真时打印omo: carried forward settings from the legacy ~/.omo layout (...)。QA 验证方案隔离 HOME 真实引擎 捕获桩QA 记录本身run.sh设计了两层验证分别针对产品能启动与launcher 究竟给引擎钉了什么两个问题真实引擎表面把开发者全局 omo-ai 安装中的code-yeongyu/senpi符号链接进沙箱包验证产品能真实启动并解析状态捕获桩表面用一个写入CAPTURE_FILE的桩引擎dist/cli.js记录它收到的完整环境验证 launcher 对引擎注入的目录值。沙箱HOME只预置统一前的扁平布局一个HOME/.omo/settings.json含favoriteModels与retry.fallbackChains随后依次执行omo --version、omo doctor两次、omo setup --dry-run、一次无覆盖的桩运行、一次设置OMO_CODING_AGENT_DIR的桩运行。完整输出见 transcript.txt。QA 观察结果四条核心结论1. 规范目录解析成立捕获桩收到的子进程环境为transcript.txt{ OMO_CODING_AGENT_DIR: HOME/.omo/agent, SENPI_CODING_AGENT_DIR: HOME/.omo/agent, brandConfigDir: .omo, brandFlatLayout: false }同时omo setup --dry-run报告 senpi harness 就来自该目录并输出PASS: no ~/.senpi anywhere in the sandbox——旧默认值曾使用的目录从未被创建。2. 显式覆盖仍然生效设置OMO_CODING_AGENT_DIRSANDBOX/pinned后两个变量名到达引擎时均为SANDBOX/pinned覆盖优先级得到验证transcript.txt。3. 不重置迁移保留全部滞留值首次 launcher 调用打印omo: carried forward settings from the legacy ~/.omo layout (settings.json)随后HOME/.omo/agent/settings.json完整持有原值favoriteModels为[anthropic/claude-fable-5,apitopia/kimi-k3-unlocked]fallbackChains为{claude-fable-5:[],openmodel/claude-fable-5:[anthropic-api/claude-fable-5:xhigh]}而扁平原文件的哈希保持字节一致0ba283a2...UNCHANGED——迁移只读不写旧文件。4. 幂等第二次启动没有任何 adoption 提示canonical 文件哈希不变PASS: canonical file unchanged。启动本身也正常omo --version输出omo 5.0.0-0.beta.7 (engine: senpi 2026.8.12-4)transcript.txt。隔离性与残余风险QA 自身的可信度边界该 QA 的另一半价值在于证明测的是沙箱没碰开发者真实状态运行前后开发者real HOME/.omo/settings.json哈希不变a1ab2671...real HOME/.omo/agent/.adopted-from-omo-flat不存在证明 carry-forward 从未在沙箱外运行沙箱运行窗口内开发者real HOME/.omo/agent/settings.json确有变化14bbcdea...到d5521fca...但这是开发者自己正在运行的 omo 会话所致新值是一条五段的claude-fable-5回退链、以apitopia/glm-5.2:max结尾既不出现在沙箱夹具claude-fable-5: []也不在扁平文件中且上述两个标记证明 QA 没有任何写路径触及它。残余风险文档自述carry-forward 会读取一个可能被用户并发编辑的目录。缓解设计是它只添加 canonical 文件缺失的键且先备份再写因此并发编辑不会丢失任何内容。已声明的省略项omo setup --dry-run需要凭据来源沙箱 opencodeauth.json存放的是字面量占位符SANDBOX-ONLY-NOT-A-REAL-KEY未使用任何真实密钥transcript 中FAIL senpi version: expected 2026.8.13, found 2026.8.12-4是沙箱产物分支钉住2026.8.13而沙箱符号链接的是全局安装的2026.8.12-4不是产品缺陷。单元测试补齐的分支沙箱跑不动的角落单次沙箱无法廉价覆盖所有分支因此文档明确指出由单元测试补齐packages/omo-native/test/agent-dir.test.tslegacy 环境变量SENPI_CODING_AGENT_DIR、PI_CODING_AGENT_DIR各自被按序采纳OMO_CODING_AGENT_DIR优先第 48-64 行空白覆盖值为 时回落到默认规范位置第 66-69 行malformed legacy JSON{ not json不会破坏启动canonical 文件保持原样且不写标记第 147-157 行永不覆写规则canonical 已存在favoriteModels时只回填缺失的retry键且生成settings.json.bak-*备份第 108-123 行跳过场景设置了OMO_CODING_AGENT_DIR覆盖时adopted为 false且覆盖目录不会被创建第 127-138 行无 legacy 状态的空 HOME 保持为空第 140-145 行不复活已删状态二次迁移是 no-op不会把 canonical 中已删除的键从 flat 复活第 93-104 行。实操要点小结想给 OmO 指定引擎状态目录设置OMO_CODING_AGENT_DIR最优先旧脚本可继续用SENPI_CODING_AGENT_DIR或PI_CODING_AGENT_DIR默认状态目录恒为HOME/.omo/agent品牌配置目录为.omobrandConfigDirflatLayout: false表示引擎状态不再直接写入配置目录首次从旧版本升级启动时launcher 会一次性把扁平布局中的六个状态文件搬入规范目录看到carried forward settings from the legacy ~/.omo layout属正常行为原文件不会被改动第二次启动不再提示若用户已显式设置目录迁移逻辑完全跳过绝不触碰用户指定的目录。延伸阅读特性 QA 记录.omo/evidence/20260814-omo-agent-dir-unification/README.md、run.sh、transcript.txt唯一实现packages/omo-native/bin/lib/agent-dir.jslauncher 注入链路packages/omo-native/bin/lib/launcher.js单元测试packages/omo-native/test/agent-dir.test.ts统一入口佐证doctor.js、setup-detect.js、compile-entry.ts【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OpenDesign 设计系统实战:以 Duolingo 为灵感的游戏化视觉语言(猫头鹰绿、厚实投影与大字号排版)

OpenDesign 设计系统实战:以 Duolingo 为灵感的游戏化视觉语言(猫头鹰绿、厚实投影与大字号排版)

OpenDesign 设计系统实战:以 Duolingo 为灵感的游戏化视觉语言(猫头鹰绿、厚实投影与大字号排版) 【免费下载链接】open-design 🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. &#x1f5…

2026/9/19 2:09:42 阅读更多 →
网站空间和数据库空间避坑指南:3个报价细节看透猫腻

网站空间和数据库空间避坑指南:3个报价细节看透猫腻

网站空间和数据库空间避坑指南:3个报价细节看透猫腻 找建站公司最怕什么?不是怕技术不行,而是怕被坑高价。很多甲方拿到报价单,看到“服务器”、“空间”这些词就头大,根本分不清哪些是必选项,哪些是溢价项。尤其是 网站空间和数据库空间…

2026/9/19 2:09:30 阅读更多 →
零基础自学PCB:Altium Designer从原理图到PCB首板实战

零基础自学PCB:Altium Designer从原理图到PCB首板实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 2:08:41 阅读更多 →

最新新闻

Function Calling、MCP、Skills 到底怎么选?Agent 模型通道改走 TaoToken 再跑流程验证

Function Calling、MCP、Skills 到底怎么选?Agent 模型通道改走 TaoToken 再跑流程验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 4:13:52 阅读更多 →
BMAD-METHOD bmad-walkthrough 技能解析:从命令渲染到五阶段人工代码审查工作流

BMAD-METHOD bmad-walkthrough 技能解析:从命令渲染到五阶段人工代码审查工作流

BMAD-METHOD bmad-walkthrough 技能解析:从命令渲染到五阶段人工代码审查工作流 【免费下载链接】BMAD-METHOD Breakthrough Method for Agile Ai Driven Development 项目地址: https://gitcode.com/gh_mirrors/bm/BMAD-METHOD 导读 bmad-walkthrough 是 B…

2026/9/19 4:13:52 阅读更多 →
RocksDB 技术 FAQ 全解读:嵌入式持久化 KV 存储引擎的定位、性能与生态

RocksDB 技术 FAQ 全解读:嵌入式持久化 KV 存储引擎的定位、性能与生态

RocksDB 技术 FAQ 全解读:嵌入式持久化 KV 存储引擎的定位、性能与生态 【免费下载链接】rocksdb A library that provides an embeddable, persistent key-value store for fast storage. 项目地址: https://gitcode.com/gh_mirrors/ro/rocksdb 导读&#xf…

2026/9/19 4:13:52 阅读更多 →
ResNet18+LSTM活体检测实战:基于OULU-NPU视频时序建模

ResNet18+LSTM活体检测实战:基于OULU-NPU视频时序建模

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 4:13:52 阅读更多 →
0-200V可编程直流电源选型:四档电压阶梯与抗扰度试验避坑指南

0-200V可编程直流电源选型:四档电压阶梯与抗扰度试验避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 4:13:52 阅读更多 →
Docker与Docker Compose实战教程:从零搭建容器化应用栈

Docker与Docker Compose实战教程:从零搭建容器化应用栈

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 4:12:51 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →