npm 上的 omo 包与本项目无关,需安装 omo-ai;从 OpenCode 或 LazyCodex 迁移需先运行 omo setup 迁移配置;安装脚本默认写入 ~/.local/bin,需确保该目录在 PATH 中
oh-my-openagent
code-yeongyu活跃维护在提示词里敲入 "mass ulw" 关键词,就能让 AI 编码助手自动编排多智能体工作流,把复杂开发任务拆解成可执行的图结构。
OmO: Just type "mass ulw" keyword with your prompt. Now you are the master of graph engineering.
curl -fsSL https://get.omo.dev/install.sh | bash
omoREADME 未说明
一个 omo 命令把提示词变成成品工作,支持多模型并行与图工程
在提示词里敲入 "mass ulw" 关键词,就能让 AI 编码助手自动编排多智能体工作流,把复杂开发任务拆解成可执行的图结构。
核心能力
- 用 mass ulw 关键字把任务展开成多智能体 DAG 并行执行
- ultrawork 模式先读代码库再规划、逐步验证并检查真实结果
- Kibitzer 用廉价小模型读取 git 中的 markdown 记忆并提醒主智能体
- /login 统一接入 Claude、ChatGPT、Kimi、GLM 等订阅模型
- 按任务加载所需技能,含浏览器使用,并合并独立工具调用
容易踩的坑
- v5.1.65最新正式版2026-11-09 · 2026-11-09 00:19 UTC
A message an agent sends to a session on another device now says who sent it. It used to arrive there as plain text, indistinguishable from that session's own user. It now carries the same sender line and authority notice as a message between sessions on one device (the sending session, its workspace and project, and the device it came from), and a leading
/in it no longer runs a command or expands a prompt template on the receiving side.omo remote sendfrom a terminal is unchanged. (#12858, part of #12852)Memory retention no longer evaluates its completion-record guard twice per record. The completion sweep now reads the guard once and keeps or removes the record on that single answer, and the retention tests check their own preconditions instead of asserting them away. No change to what retention keeps or removes. (#12783, follow-up to #12532)
The standalone
omobinary'somo doctorreports memory runtime size again, like the npm install. Each memory identity's runtime size against its cap and the total across identities are printed by both distributions, so binary/npm doctor parity holds (#12785). (#12783)Old binary runtimes are pruned safely when two
omolaunches start at once. A launch no longer deletes a runtime another launch is still pruning, and a runtime that launch already removed is not reported as a failure.omo --version,--helpandomo updatenever prune. (#12770, follow-up to #12627)A task child whose engine cannot hold its designated model chain is no longer started. Before, when a process child's engine could not take its chain (an older engine, a refused
set_retry_fallback, or no answer in time) or a task host did not advertiseretry_fallback_profile, the child was still prompted and ran on the engine's own fallback settings, which can reach models outside its chain. The start now fails before the first prompt and names every designated model and the reason, and such a host is refused as incompatible, naming the same models. (#12759) (#12761)A command on a closed session on another device now reports the same error as on this device. It answered
session_not_foundremotely andunknown_sessionlocally; both now answerunknown_session. (#12755) (#12756)omo hands its device keys to the device service from memory, with no credential store read for relay. A fresh sign-in (
omo login,omo account adopt) deletes the signed-out marker and then hands its in-memory keys and account to a running device service. The memory sync session re-adopts from the credential it already holds when the service reports no adopted device. Every sign-out path (logout, forget, a session the service ended) tells the service to forget the device. The start-up bootstrap no longer reads the stored credential.device.adoptcarriesaccountonly to a device service at 0.1.3 or newer, and the pinned device service is raised to 0.1.3 (design D PR 4). (#12735)omo remotecan open, send, switch model, interrupt and close sessions on your other devices.omo remote open <device> [--project P] [--model M]starts a session there and prints<device>/<session>; `omo remote - v5.1.642026-11-07 · 2026-11-07 16:57 UTC
查看更新说明
Desktop memory sync now starts as soon as the engine boots, without waiting for a session. An engine started by
omo host ensureloads extensions only when a session opens, while the desktop opens none until the engine has sent the memory-sync bootstrap handshake, so the two waited on each other. The compiledomoand the npm launcher now start that one claim before the engine loads whenever an RPC engine's launch declares amemory-syncchannel; the first session reuses it. A claim that fails still reports memory sync as unavailable and never falls back to CLI credentials. (#12702) (#12704)Internal (tests only): macOS trust acquisition reads
/etc/ssl/cert.pemthrough the already-injectable bundle reader, and a test now proves that a malformed default file yields the structuredopenssl-default-file-malformeddrop entry (file, cause, block index, narrowing). (#12633)Internal (tests only): the OpenSSL default-file importer tests now pin that any high byte on a BEGIN line, not only a BOM, drops the whole file. (#12632)
Internal (release tooling): the omo-native trust mutation harness counts a mutant as killed only when a named test fails by an assertion; a mutant that only throws a runtime error or crashes on load is now reported as
crashedand fails the run. (#12631)Fixed
- Memory sync no longer loses an edit when two devices change the same line of a memory file at the same time. Devices on this version keep both edits as whole lines, and every device converges. Before, the edits were merged character by character into text that matched neither (#12279).
- Between devices on this version, an edit does not disturb a line nobody edited. The exception is a very large rewrite: when one device adds and removes more than about 2,000 lines of a note in one save, that save is merged character by character, as before this fix, so a concurrent edit to the same line can still splice.
- When the note's body or the new text does not end with a newline, the edit is still merged character by character, as before, so two concurrent edits to that last line can still splice.
- With a device that still runs an older version, its old character merge can still go wrong in these ways:
- Adjacent lines can fuse. The older device rewrites the line right after a line this version edited. Depending on the two devices' internal ids, the two edits can fuse into one line followed by an empty line. Measured: from
head,one,two,tail, this version writesONEand the older device writesTWO, and the result can behead,TWOONE, an empty line,tail. Two older devices givehead,ONE,TWO,tail. - Leftover text moves. The older device edits a line this version deletes. Its leftover text joins a neighbouring line.
- Its own diff touches other lines. The older device's character merge crosses into a line its user did not edit. This also happens between two older devices.
- Adjacent lines can fuse. The older device rewrites the line right after a line this version edited. Depending on the two devices' internal ids, the two edits can fuse into one line followed by an empty line. Measured: from
- Two older devices keep their old character merge until they update. (#12597)
- Memory sync: the push phase of a large memory set no longer needs memory in proportion to the whole set. Every push step used to re-read and re-write one journal file holding every pending item's data, several times per batch. A device pushing a few thousand memory files therefore peaked at 2 GiB or more (#12286). The journal now keeps a small index of pending items with their data in separate files, and a push reads only the batch it is sending. Capturing the set before the push still holds each captured file's text until the capture ends. A journal written by an older
- Memory sync no longer loses an edit when two devices change the same line of a memory file at the same time. Devices on this version keep both edits as whole lines, and every device converges. Before, the edits were merged character by character into text that matched neither (#12279).
- v5.1.632026-11-07 · 2026-11-07 12:38 UTC
查看更新说明
The macOS keychain helper's lookup paths and tests are correct on Windows CI. The macOS install locations (the OmO.app runtime and helper copies) are built with POSIX separators on every host, and the #11262 keychain-helper tests use platform-correct paths, so dev's Windows test legs pass again. (#12690, part of #11262)
Fixed: the first device listing no longer waits about 10 seconds for each signed-out or otherwise unsupported device; the bunshin SDK answers such a device's tool list as empty at once instead of trying to describe it. (#12680)
Internal: the vendored bunshin SDK imports its own pinned typebox through omo-senpi's
#bunshin-ts-dep/imports instead of the bare package name, so senpi's extension registry can no longer hand it a different typebox; no user-visible change. (#12676) (#12680)Thread ops on another device spend fewer relay round trips: the session's attach is kept across ops, and the session's model catalog is held on it, so a model switch to an exact
provider/idthat catalog lists is oneset_model. A set that may have run is still reported asidempotency_uncertain; a refused one re-reads the catalog and answers as a fresh catalog would. Status and transcript reads (get_state,get_messages) still go to the device every time, because the engine's in-memory state changes without a record on the attach. (#12672)Starting omo no longer reinstalls and restarts a running device service that is only slow to answer: on macOS and Linux a handshake timeout is retried once and then reported as degraded, instead of being treated as a stopped service. (#12665)
A message sent to a thread on another device whose engine answers
startedwithout a turn id (senpi 2026.11.2) is now confirmed with the running turn thatget_statereports, instead ofidempotency_uncertain. (#12660)Fixed: closing a thread on another device answers closed instead of uncertain (reply_lost); the close was applied there, but its answer was dropped when the other device ended the session's attachment. (#12655)
Fixed: a thread created on another device (thread_create with a device, or a fork there) is named by the id that device lists it by, so reading, messaging, interrupting, switching the model of and closing it work instead of answering session_not_found. (#12651)
Internal: knip ignores the closed-device-login preload fixture (a --preload test file, nothing imports it); no behavior change. (#12648)
A delegated child whose own model chain has no connected provider now fails with one message that names every model in that chain and the exact fix, instead of an opaque "no available model". The chain is listed in order with the providers each model needs, the refusal says which providers are not connected, and it names the key the app's Settings editor writes (
categories.<name>.modelfor a category,agents.<name>.modelfor an agent), so the parent session can act on the first line instead of retrying a dead binding. The same refusal now covers a lane pinned to a model this machine's registry does not serve, naming the pin and the Settings key. Nothing is substituted and no child is spawned (#12634). (#12636)Internal (tests only): in the omo-native trust-stage TLS probe, a channe
- v5.1.622026-11-06 · 2026-11-06 06:54 UTC
查看更新说明
What changed
omo verifies the device service it downloads against the real release key set. The device service's release key set is now pinned to the minted Ed25519 keys, operational first and recovery second, in
packages/device-service-core/src/release/release-key.json(a byte copy of the service's ownrelease-key.json). A release signed by either key installs; one signed by neither, or with a malformed signature, is refused before anything is written. Until now the pin was a placeholder that refused every release. (#12437)Skills and prompts no longer point at skills, files or agents that do not exist, and CI now refuses any new one. The Native ultrawork directive told sessions to read the
bun-1-4skill, which Senpi renamed tobun; it now namesbun.remove-deadcodeasked for atypescript-programmerskill, which made OpenCode refuse the wholetaskcall; it now loadsprogramming.frontendandulw-researchno longer load anopen-designskill that omo never shipped and instead name the nexu-io/open-design library. Theulw-researchassembly worker loadsimagegenandulw-looponly when the session lists them, andfrontendloads thebrowserskill where it asked for OpenCode'splaywright. OpenCode now ships thehyperplanskill that its hyperplan mode tells the session to load; until now only this repository's own checkout had it. Sevenprogrammingreferences and onefrontendcross-reference that pointed at files in the wrong directory, or at a file that never existed, now open the right file. A new check in the root test suite resolves every skill name, skill-relative path, agent and category in shipped skills and prompts for each edition that ships them, and names the closest real target when one is missing. (#12484)When omo drops the OpenSSL default certificate file (
/etc/ssl/cert.pemon macOS) from the engine's trust store, it now tells you why.omo doctorprints an INFO line naming the file, the cause, the certificate block where reading stopped, and whether the drop trusts fewer certificates than plain Bun would.omo trust ensure --jsonreports the same facts asdefaultFileDrop. It is never a warning or a failure. (#12499, part of #10762)2026-11-05 - Name the OpenSSL default-file drop (#12499, part of #10762)
Design revision 11, 4.4 item 6.
readDefaultFileCandidatestakes its narrowing flags from the exportedDROP_CAUSE_NARROWINGtable. On a drop,acquireEngineTrustrecords oneopenssl-default-file-malformedentry carryingfile,cause,blockIndexandnarrowinginstead of two plain codes, and returns it asdefaultFileDrop.runTrustStageprints it in thetrust ensure --jsonline.trust-diagnostics.tsaccepts that structured entry and still accepts the plain code for an unreadable file; it refuses another file name, an unknown cause, a non-integer block index or a narrowing flag that does not match the cause.engine-trust-doctor.tsreads the adopted generation'sdiagnostics.1.jsonlanddiagnostics.jsonl, takes the lastimport-execorensurerecord of that generation, and givesomo doctorone INFO line: the drop, ordefault-file: kept/unreadable. A missing or torn log yields no line and never fails doctor.Native skills no longer point Senpi sessions at OpenCode-only agents, tools and commands. A community audit of the installed skills found 16 more references that exist only in OpenCode or nowhere:
refactorconsulted anoracleagent and calledteam_listandteam_status,debuggingended a team withteam_shutdown_requestandteam_approve_shutdown,frontendloaded skills through askilltool and address - v5.1.612026-11-05 · 2026-11-05 19:01 UTC
查看更新说明
Runs on senpi 2026.11.3-3: Claude Opus and Fable get their full system prompt back (the pre-diet wording; every other model keeps the slimmer prompt), Anthropic Subscription no longer refuses a working Claude login as blocked when an older omo process is still running or when Claude Code can't read its login behind a locked keychain, a usage limit with an ISO reset time blocks that account until the reset instead of retrying every minute, a goal waits for the first limited account to come back instead of spending turns, and Shift+Enter inserts a newline in macOS Terminal.app. (#12311)
Runs on senpi 2026.11.3-3: the engine socket can now send compact message updates (
compact_message_updates_v1) withevent_resyncrecovery, so long streamed turns cost less to relay. It stays off unlessSENPI_ENGINE_SOCKET_COMPACT_UPDATES=1is set. (Part of code-yeongyu/senpi#4272) (#12215)macOS computer use keeps the display awake while it operates, and says when the screen is locked or asleep. The engine now holds a
PreventUserIdleDisplaySleeppower assertion ("OmO computer use is operating the desktop" inpmset -g assertions) from the first request other thancapabilities,control.stateandstopPath.*until 60 seconds after the last one;session.close, a disconnect and a stop release it at once.capabilities.displayAsleepreports when every display of the session sleeps,omo doctorprints it on the display line, and aCaptureFailed,InputFailedorTimeoutmessage ends with(the screen is locked)or(the display is asleep)when that is the likely cause. Other platforms are unchanged. (#11530, part of #11466)Fixed
- In the desktop's first-run setup, "Understanding you" no longer stops with "No retained scan with this id" after About you brings anything in. Applying an onboarding scan now keeps it available to understanding until the scan expires; a scan is still applied only once. (#12509, fixes #12508)
- The engine now registers its agent dir with the device service even when the service's state directory appears right after the engine started (for example, when the device service is installed or started at the same moment). A freshly armed directory watch can miss an entry created in its first milliseconds, so the registrant never noticed the service and other devices listed no sessions. Each watch arm now re-checks the path once after it settles. (#12482)
- Your other signed-in devices now see this device's sessions after the OmO device service starts or restarts. Every
omoengine, in the terminal and the ones the desktop app starts, keeps its own agent directory registered with the device service and registers it again when the service comes back or the device is signed in again; it never holds an engine open and stays off with"device_service": { "enabled": false }. (#12380, fixes #12379) - A reflection sandbox probe that timed out once (for example on a busy machine) no longer turns the sandbox off until restart. Reflection checks again on its next run, so it runs sandboxed again once bwrap responds. A machine where bwrap definitively cannot create a sandbox is still checked only once (#12376). A reflection run that falls back to running unsandboxed because bwrap is unusable at that moment is now logged once as a degraded sandbox, and once more when the sandbox comes back, instead of pa
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
English | 简体中文 | 日本語 | Русский | 한국어 | Español | Français | Deutsch | Português (Brasil) | Italiano
[!NOTE] OmO 5.0: OmO ❤️ Pi Install it with
curl -fsSL https://get.omo.dev/install.sh | bash. Memory system, CodeMode, Anthropic subscriptions, all covered.Just type "mass ulw" with your prompt - now you are the master of graph engineering. Multi-model ultracode, together with a better memory system. (The right panel is omo-herdr-dag.)
Sponsors These are our sponsors. They help keep OmO going as a personal side project.
OpenGateway sponsors OmO. An OpenAI-compatible gateway that puts many model providers behind one API. Thank you for backing open source.
[!TIP] Be with us!
Join our Discord community to connect with contributors and fellow OmO users. Updates for OmO used to be posted on my X account. Since it was mistakenly suspended, @justsisyphus now posts updates on my behalf. Follow @code-yeongyu on GitHub for more projects.
OmO
Your tool for real work. But it's an agent.
OmO is one omo command that turns your tokens into finished work: research across ten thousand sources, a deck people actually get, backends, frontends, code. It runs on senpi, our fork of pi, with everything below built in.
Install
curl -fsSL https://get.omo.dev/install.sh | bash
omo
On Windows, in PowerShell: irm https://get.omo.dev/install.ps1 | iex. The script installs the native omo binary for your OS and CPU into ~/.local/bin, checks it against the release checksums, and falls back to GitHub Releases when the mirror is unreachable. Add -s -- beta (or a version such as -s -- 5.1.1) after bash to pick another channel. Windows CMD, fixing your PATH, updating and uninstalling are covered at omo.dev/docs/install.
Prefer a package manager? bun add -g omo-ai (or npm i -g omo-ai) installs the same OmO. The package is omo-ai; the unrelated omo package on npm is someone else's.
Open your project, run omo, describe the job. That's the whole setup.
In a session, /thinking <level> sets how hard the model thinks (/thinking alone opens a picker), Shift+Tab cycles through the levels, and /efforts <level> sets the reasoning effort directly on models with effort grades. To pick up earlier work, /resume (or /sessions) opens your past sessions; from the shell, omo -c continues the last one and omo -r opens the picker. /help lists everything else.
Coming from the OpenCode edition or LazyCodex? Run omo setup once. It carries your provider keys, custom providers, MCP servers, skills and model picks across. omo doctor then shows which task categories your providers can run and what the old install left behind, and omo doctor --models shows which model each category and agent runs and in what order (keep one out everywhere with exclude_models). The full walkthrough is Migrating from OpenCode.
To update, run the install line again (a package-manager install updates with omo update). rm ~/.local/bin/omo removes the binary install; bun remove -g omo-ai (or npm uninstall -g omo-ai) removes the package install.
Why OmO
ultrawork. Skip the study. If a task feels hard, add ultrawork (or ulw) to your prompt. The agent reads the codebase before touching a line, plans, proves each step before moving on, checks the result on the real surface, and stops when it's done.
Hundreds of agents, one keyword. Type mass ulw and the whole job becomes a graph of agents: deep research over thousands of sources, a full machine-learning pipeline, a migration nobody wants to do. Each part runs on the model that fits it, in parallel, and gets checked before anything is called done.
Kibitzer. Your agent doesn't forget you, or your work. Memory lives in a git repository of markdown files. A small, cheap model sits beside the expensive main agent, reads what you've done before, and nudges the main agent before it repeats a mistake. You stop re-explaining yourself.
Mix models without thinking about it. Use the frontier models you love together with the cheap ones. Just sign in: /login covers Claude, ChatGPT, Kimi and GLM subscriptions. Every model ships with a system prompt tuned for it, so you never pick the wrong one.
High-quality skills, only the ones you need. Your model is smart, but it still doesn't know a lot about solving real-world problems. OmO ships the missing knowledge as skills, browser use included, and loads only what the task needs.
Everything else is crafted. Independent tool calls run together in one small program, so twenty reads are one round trip. Malformed tool arguments are repaired before they run. Waiting on a build or a deploy is a subscription, not polling. Long work keeps a record of what was checked, so a restarted session picks up where it stopped. Config, skills and prompts reload live.
Configuration
Opinionated defaults, adjustable if you insist. Your settings live in ~/.omo/omo.jsonc, and a project can add its own .omo/omo.jsonc; the closest file wins. Every key is in the configuration reference.
Docs
- omo.dev/docs
- Migrating from OpenCode
- Configuration reference
- Features
- Computer use (experimental)
- Ultrawork Manifesto
Reporting a bug
The fastest way to report a bug is /bug inside a session (available in the omo app). It lists what it includes and lets you see the exact report before you send it, then sends it to the OmO team: the recent engine log, your environment and config with secrets blanked, the session transcript, and identity lines - your device name and, when telemetry is on, an install id and a session hash, plus your account details (email, name, account, user and device ids, plan, device name) when you report from the desktop app, so we can reply. Everything but the identity lines goes through the upload redactor. GitHub issues stay open for anyone who cannot use the in-app report.
Reviews
"It made me cancel my Cursor subscription. Unbelievable things are happening in the open source community." - Arthur Guiot
"If Claude Code does in 7 days what a human does in 3 months, OmO does it in 1 hour." - B, Quant Researcher
"You guys should pull this into core and recruit him. Seriously. It's really, really, really good." - Henning Kilset
Author's Note
When I have to take the wheel back from an agent, that isn't teamwork. The system failed. OmO is built on that idea. You say what you want; the agent researches, plans, writes code you couldn't tell from a senior engineer's, verifies it, and keeps going until it's finished. It spends tokens when they buy real speed and routes the easy parts to cheap models.
I'm this project's most obsessive user. Which model has the sharpest logic? Who writes the best prose? What did everyone else ship this week? OmO is where those answers land. Have a better way? PRs welcome.
The goal is an agent you stop noticing. You flip the switch, the light turns on. The long version is the Ultrawork Manifesto.
No affiliation with any project or model mentioned. The Ultragoal and UltraQA ideas come from oh-my-codex, reimplemented from concept for OmO.
Loved by professionals at
Indent, makers of Spray (influencer marketing solution), vovushop (cross-border commerce platform) and vreview (AI commerce review marketing solution). Google. Microsoft. Vercel. ELESTYLE, makers of elepay (multi-mobile payment gateway) and OneQR (mobile application SaaS for cashless solutions). Deepgram.
