@yjjeong/omg
v0.3.1
Published
Multi-LLM team orchestrator for a single working directory.
Downloads
181
Maintainers
Readme
omg
Multi-LLM team orchestrator for a single working directory.
omg coordinates provider CLIs as a team — Claude CLI, Codex CLI,
and agy — while keeping provider and model names separate
(Claude→Opus/Sonnet, Codex→GPT, agy/Antigravity→Gemini). Each agent gets a role
(planner / implementer / reviewer / verifier), a single director resolves
conflicts, and a shared context bus keeps handoffs intact.
omgc, the Go/Bubble Tea cockpit, is the interactive surface; the Node CLI
remains for headless orchestration, setup, updates, MCP, and scripted smoke.
Team reasoning, tool calls, and verdicts are surfaced through the Cockpit
activity/transcript views and the JSON-RPC stream.
Why
Most multi-LLM tools either pick one model per task or run them in isolation.
omg treats provider-backed agents as a team with explicit roles and a
consensus mechanism — a Claude/Opus planning step can inform a Codex/GPT
implementation, and an agy/Gemini verdict does not silently stall the
pipeline.
Prerequisites
- Node ≥ 20
- Linux, macOS, or Windows. The internal broker IPC uses a Unix-domain socket on POSIX and a named pipe on Windows. Windows support is experimental in v0.x — verify in your environment; WSL also works.
- At least one provider CLI installed and logged in, OR
--demo/--provider stubfor a no-deps trial. Provider options:
omg never sees your provider tokens; it spawns the CLIs you already
authed.
After install, run omg doctor to verify your providers are installed,
logged in, and (for Gemini) MCP-registered — it prints the exact fix command
for any gap, and only flags the providers your active team preset actually
uses. Add --install (omg doctor --install) to install the missing
required provider CLIs using each provider's installer (npm i -g for
npm-managed CLIs, Google's installer for agy). Add --install-sdk
for API-key SDK paths, or --install-all for both. Then run the printed
omg login <provider> to authenticate each CLI. omg login <provider> also
re-runs a provider CLI's own login when its auth has expired. Use
omg doctor --instructions to audit global/project instruction files for
legacy .omc / .omx guidance without deleting anything.
For a guided first-run checklist, use omg setup. It scaffolds the local
project files idempotently, runs doctor with instruction diagnostics, checks
updates, then prints both setup paths: subscription CLI auth and API-key SDK.
Bare omg delegates to the Go Cockpit (omgc) when a TTY is available.
First-run/setup work is handled explicitly through omg setup, omg doctor,
and omg update; provider login stays explicit via omg login <provider>.
omg also checks for newer versions of omg, Claude Code, Codex
CLI, Gemini CLI, and agy on normal startup. The check is advisory,
cached, and written to stderr so headless JSON output stays clean. Run
omg update for a full report, or omg update --install to apply
available updates: npm-managed CLIs (omg, claude, codex, gemini),
Homebrew-managed Codex casks when detected, Claude's native updater when the
active Claude binary is outside npm, and agy update when agy is stale.
Quick Start
npm install -g @yjjeong/omg
omg setup # first-run checklist
omg --demo --headless # no external CLI required
omg --run "hi" --provider stub --headless # stubbed orchestrator turn
omg # delegates to the Go Cockpit
omg cockpit --provider stub --headless # Cockpit smoke
omgc # fullscreen Go Cockpit TUIomg --demo --headless is the safest scripted first-impression — it runs the
full pipeline against a built-in stub provider, no auth or external binary
needed. For the interactive first impression, run omgc.
Usage examples
# Real provider via OAuth subscription (no API credit consumed).
omg --run "draft a release note" --provider claude-cli --headless
omg --run "draft a release note" --provider codex-cli --headless
omg --run "draft a release note" --provider agy --headless # agy/Antigravity provider, Gemini model family
omg --run "draft a release note" --provider gemini-cli --headless # standalone Gemini CLI
# Real provider via API key (uses official SDK; installs on demand).
omg --run "draft a release note" --provider claude --headless # @anthropic-ai/sdk
omg --run "draft a release note" --provider codex --headless # openai
omg --run "draft a release note" --provider gemini --headless # @google/genai
# Multi-role team with voting consensus.
omg --team-run "ship a python hello world" --provider claude-cli --headless \
--reviewers reviewer,verifier --strategy voting
# Agentic loop — tool results feed back into the next turn.
omg --run "demo" --provider stub --tools --loop --headlessCLI surface
omg [--version] [--help]
omg doctor [--json] [--install] [--install-sdk] [--install-all] [--instructions]
# diagnose install / auth / SDK / instruction leakage
omg setup # guided first-run checklist
omg update [--json] [--install] # check/apply tool version updates
omg login <claude|codex|agy> # antigravity/gemini remain explicit aliases
# (re)authenticate a provider CLI
omg init # scaffold AGENTS.md/CLAUDE.md/GEMINI.md + .omg/mcp.json here
omg --demo --headless [--tools | --write-tools] [--ask]
omg --run <PROMPT> --headless [--role <ROLE>] [--provider <P>]
[--tools | --write-tools] [--loop --max-steps N]
omg --team-run <PROMPT> --headless [--reviewers role1,role2,...] [--strategy S]
[--max-iterations N] [--provider <P>] [--model <M>]
[--tools | --write-tools]
omg cockpit [--run <PROMPT> | --team-run <PROMPT>] --headless [--provider <P>] [--model <M>]
omg cockpit [--effort <level>] # preselect model-specific reasoning/thinking
omg cockpit session list|show|last|rename|delete [--json] # persisted Cockpit sessions
omg cockpit --continue # resume latest Cockpit session
omg cockpit logs [--tail N] [--follow] [--json] # structured Cockpit diagnostics
omg cockpit checkpoint [--last|--list] [path] [--json] # compact checkpoint artifacts
omgc # interactive Go Cockpit onlyProviders: policy (read from src/policy/team.yaml), stub, claude
/ codex / gemini (SDK), claude-cli / codex-cli /
agy / antigravity-cli (recommended subscription CLIs), plus gemini-cli as an
explicit standalone compatibility provider. nvidia / nim is also available as an
experimental OpenAI-compatible NVIDIA NIM API provider using
NVIDIA_API_KEY and https://integrate.api.nvidia.com/v1.
Consensus strategies: escalate (default — severity-first veto),
voting (plurality), hierarchy (top reviewer wins).
Interactive surface
The retired Node interactive REPL has been removed. Use:
omgc(or bareomgin a TTY) for interactive work.omg --run ... --headless,omg --team-run ... --headless, andomg cockpit ... --headlessfor scripts and CI.omg setup,omg doctor,omg update,omg login, andomg initfor administration.
State lives in ~/.omg/: team-preset, plan.json, memory.md, Cockpit
sessions/checkpoints, and MCP configuration.
omgc Cockpit TUI
omgc is the short interactive alias for the Go/Bubble Tea Cockpit frontend;
TTY omg cockpit without scripted subcommands delegates to the same Go binary.
It keeps OMG's run ledger, sessions, provider policy, and team/director concepts,
but opens directly into a keyboard-first terminal cockpit.
Interactive omgc uses an alternate-screen fullscreen surface by default,
enables xterm mouse tracking for wheel/click/drag, and keeps the composer
pinned to the bottom of the screen. Set OMG_C_NO_ALT_SCREEN=1 if you
explicitly want normal-screen rendering.
omgc intentionally accepts no arguments. Use omg cockpit ... for scripted
runs, session management, diagnostics, logs, checkpoints, and smoke tests.
There is no /workflows slash command in omgc; live work is reflected in the
right-side Activity panel, Status, and Skills views instead.
Workflow-style skills are explicit: open Skills from the command palette
or submit /skill <name> [goal]. Press Enter in Skills to toggle a project
recommendation, or Ctrl-R on a skill row to run it as a visible Cockpit turn.
Running skills appear in the normal run ledger and Activity panel as
skill:<name>; omgc does not start hidden background workflows.
For NVIDIA's free/dev NIM endpoints, open Switch model (Ctrl-M) inside
omgc and choose one of the curated high-performance NVIDIA rows, such as
nvidia/nemotron-3-ultra-550b-a55b, nvidia/nemotron-3-super-120b-a12b,
mistralai/mistral-large-3-675b-instruct-2512,
mistralai/mistral-medium-3.5-128b, mistralai/mistral-small-4-119b-2603,
minimaxai/minimax-m3, stepfun-ai/step-3.7-flash, or openai/gpt-oss-120b.
EOL or unstable rows are kept out of the curated picker. MiniMax M3 is a preview
model with non-commercial license caveats in the NVIDIA model card. If no
NVIDIA_API_KEY is configured,
omgc prompts for it in-place, masks the input, saves it to
~/.omg/api-keys.json with 0600 permissions, then switches to the selected
model. You can get a key from NVIDIA Build's API key page
(https://build.nvidia.com/settings/api-keys; NGC personal keys need
NGC Catalog + Public API Endpoints). Treat NVIDIA NIM as an experimental
fallback: free/dev endpoint availability and model support can change per
NVIDIA's catalog.
Appearance is also first-class in omgc: open Appearance / Theme from the
command palette, submit /theme or /appearance, or ask in natural language
(e.g. "테마 피커 열어줘"). Built-in presets include OMGC Charmtone,
Catppuccin Mocha/Macchiato/Latte, Tokyo Night, Rosé Pine Moon, High Contrast,
System Auto, and No Color / ASCII Safe. The picker applies immediately and saves
to ~/.omg/cockpit-theme.json with 0600 permissions. OMGC_THEME=<preset-id>
can force a preset for launches, and NO_COLOR=1 disables ANSI colors while
keeping reverse-video selection/search affordances.
The Reasoning / Thinking picker is model-aware. Codex CLI rows expose the
Codex effort levels; supported NVIDIA rows expose their documented controls
such as Nemotron enable_thinking / reasoning_budget, DeepSeek thinking,
and GPT-OSS or Mistral reasoning_effort. Unsupported providers/models show a
single safe Default row and send no extra reasoning fields.
Predict ghost text is intentionally fast by default. When enabled from the
command palette, omgc now generates a local next-message suggestion immediately
after the previous turn and filters low-confidence phrases such as "no
confidence" instead of showing them as a ghost. If you explicitly want an extra
LLM refinement pass, set OMGC_PREDICT_LLM=1; the refinement is capped to a
short best-effort timeout so it cannot stall the UI.
The welcome screen runs a non-blocking update check for omg and provider CLIs.
If updates are available, select the Updates row and press Enter to run the
same updater as omg update --install directly from the TUI. npm-managed CLIs
are updated with npm install -g, Homebrew Codex casks use
brew upgrade --cask codex, Claude native installs use claude update, and
agy uses agy update when installed.
Optional notifications can mirror high-attention Cockpit events outside the
terminal. Set OMGC_NOTIFY=desktop for native OS notifications, or set
OMGC_TELEGRAM_BOT_TOKEN + OMGC_TELEGRAM_CHAT_ID to send Telegram messages.
Use OMGC_NOTIFY=all to enable both, OMGC_NOTIFY_EVENTS=permission,complete,failed,update
to choose event classes, or OMGC_NOTIFY_LOG=/tmp/omgc-notify.jsonl to record
local JSONL audit/dry-run notifications without OS or Telegram side effects.
Use OMGC_DISABLE_NOTIFICATIONS=1 to force silence. Notifications are
best-effort and never block a running turn.
If you are developing from a cloned repository and omgc prints
command not found, build and link the package first:
npm install
npm run build
npm link # exposes both omg and omgc from package.json bin
omg doctor # verifies the omgc alias and Cockpit state dir
omgc # interactive Go cockpitWithout linking, use the scripted Cockpit surface through Node:
node dist/cli.js cockpit --provider stub --headless
node dist/cli.js cockpit logs --tail 50Safe smoke commands:
omg cockpit --provider stub --headless
omg cockpit --run "summarize this repo" --provider stub --headless
omg cockpit --team-run "review this plan" --provider stub --headless
omg cockpit session list --json
omg cockpit session last
omg cockpit session show <session-id-or-prefix> --json
omg cockpit checkpoint
omg cockpit checkpoint --list
omg cockpit checkpoint --list --json
omg cockpit --continue
omg cockpit logs --tail 50
omg cockpit session rename <session-id-or-prefix> "New title"
omg cockpit session delete <session-id-or-prefix>Interactive keys:
Ctrl-Popens the command palette.Ctrl-Sopens session selection.Ctrl-Mopens model routing./model provider/modelalso changes future runs./themeopens Appearance / Theme and persists the selected palette.Ctrl-P→ Reasoning / Thinking (or/effort) picks the current model's reasoning/thinking setting for future runs;--effort <level>preselects it at launch.Ctrl-Uopens pending permission requests. The default confirm action is deny; inside the permission dialog,ftoggles fullscreen diff,vexpands/collapses the diff, andj/kscroll.Ctrl-Ttoggles solo/team submit mode.@fileand./pathcomplete repository files; large paste becomes an attachment.- Mouse wheel, click-drag on the transcript, and drag on the right scrollbar scroll the transcript; clicking the composer returns focus to prompt input.
↑/↓scroll the transcript;Ctrl-Efollows the latest event again.
Cockpit state is persisted under ~/.omg/cockpit/ by default; set
OMG_COCKPIT_STATE_DIR=/tmp/somewhere for isolated tests. Completion status is
driven by canonical run/session events (run.completed, run.failed,
permission resolution, verifier/director events), not by assistant prose such as
"done" in the transcript. Provider/auth/credit failures and compact timeouts are
shown as actionable recovery cards instead of raw stderr-only messages.
Cockpit shared backend lifecycle:
- By default, interactive commands use a local workspace unless a socket-backed backend is already live.
- Set
OMG_COCKPIT_SOCKET=1to connect interactiveomgcand scriptedomg cockpitruns to a shared backend when available. - When
OMG_COCKPIT_SOCKET=1is set and no socket exists yet, Cockpit auto- starts a process-local shared backend and shuts it down automatically when the launcher exits. - For long-lived shared collaboration, run
OMG_COCKPIT_SOCKET=1 omg cockpit servein a dedicated terminal and keep it running. - Use
omg cockpit serveexplicitly when you want the backend to outlive the command that created it.
Current known limitations: Cockpit is now the Go/Bubble Tea omgc surface;
the retired Node interactive renderer has been removed. MCP server toggles
and recommended-server adds are wired in the Go cockpit. LSP
is discovery-backed and can explicitly attach/detach recommended language-server
processes from the LSP panel; publishDiagnostics counts are captured from
native LSP output, while richer references/rename/actions still need a fuller
protocol client. Visual acceptance is covered by unit/PTY-style smoke, a public
cell-based Go cockpit matrix, and the local Crush comparison harness rather than
private pixel-perfect Crush screenshot goldens; provider auth/credit failures
render as Cockpit recovery cards when surfaced by the underlying CLI/API; and
performance scorecards include deterministic Go render smoke checks, not
OS-level frame timing guarantees.
End-to-end Cockpit PTY lifecycle tests (test/e2e/cockpitPtyLifecycle.test.ts)
are PTY-only and skip with an actionable reason in runtimes that cannot spawn
node-pty (set OMG_FORCE_PTY_E2E=1 to force failure and surface the PTY
launch error).
For release validation, capture PTY capability first via npm run check-pty-env,
then run npm run test:cockpit so PTY smoke and long-lived shared-backend
socket ownership tests are both exercised in one command.
When PTY tests are skipped unexpectedly, run:
node scripts/check-pty-env.mjsThis prints the active node binary, node-pty helper path/permissions, and the
exact spawn error before you retry PTY e2e tests.
Cockpit regression checks:
npm run test:cockpit(single-command cockpit release gate: PTY readiness + shared-backend + socket ownership + PTY lifecycle smoke set)npm test -- test/unit/cockpitCli.test.ts(long-lived shared-backend supervision + session/store interactions)npm test -- test/unit/cockpitSocketTransport.test.ts(socket transport and permission ownership edge cases)npm test -- test/e2e/cockpitPtyLifecycle.test.ts(PTY exit lifecycle; may skip in non-PTY environments)
Troubleshooting
- Not sure what's misconfigured? Run
omg doctor— it reports per-provider install / login / MCP status and the exact command to fix each gap.omg doctor --jsonemits the same as machine-readable JSON. omgc: command not found— local clones neednpm run build && npm linkbefore theomgcbin alias exists on PATH. If you do not want to link, runnode dist/cli.js cockpit.omg doctornow reports the alias state, exact recovery commands, and the activeOMG_COCKPIT_STATE_DIR.- "binary not found on PATH" — install the provider CLI shown in the
error message, or try
omg --demoto confirm omg itself works. - TUI doesn't render properly — use a modern terminal (iTerm2,
Alacritty, Kitty, Wezterm, recent Terminal.app, recent Windows Terminal
via WSL). Legacy
xtermwith limited ANSI support may misrender. - Doesn't exit on
/quit—Ctrl-Ctwice escalates; please file an issue if you hit this consistently. - "Cannot find module '@anthropic-ai/sdk'" when using
--provider claude(the SDK, notclaude-cli) — install it:npm install -g @anthropic-ai/sdk. Provider SDKs are optional peer dependencies. - Team role runs forever with no visible work — build roles are cancelled
after 20 minutes with no output/tool progress; reviewers after 5 minutes.
Override with
OMG_TEAM_BUILD_IDLE_TIMEOUT_MS,OMG_TEAM_REVIEW_IDLE_TIMEOUT_MS, orOMG_TEAM_IDLE_TIMEOUT_MS. - Update nags are noisy/offline — set
OMG_SKIP_UPDATE_CHECK=1. The default check is cached for 6 hours; override withOMG_UPDATE_CHECK_TTL_MS. - Windows ask/picker path is suspect — run
npm run build && npm run test:windows-pickeron the native Windows machine. It exercises the built hooked-tool proxy, named-pipe broker, and~/.omg/hookedtool.log.
Platform support
| Platform | Status | |---|---| | Linux (x64 / ARM64) | ✅ Supported | | macOS (Intel / Apple Silicon) | ✅ Supported | | Windows (x64) | 🧪 Experimental — named-pipe IPC; verify locally. WSL also works. |
Development
git clone https://github.com/jyj902/omg.git
cd omg
npm install
npm run build # tsc + copy-assets (verifies dist/cli.js --version)
npm test # full vitest suite
npm run test:windows-picker # built hooked-tool picker smoke (named pipe on Windows)
npm run test:pack # npm pack + clean-prefix install smoke
npm link # `omg` global symlink → dist/cli.jsThe repo's full design rationale lives in AGENTS.md (the single source of
truth for all agents; CLAUDE.md is a thin stub that imports it) and
.omg/audit/ (the architectural audit + cleanup queue).
