diff --git a/bin/omarchy-agent b/bin/omarchy-agent index 964254e8..3c009460 100755 --- a/bin/omarchy-agent +++ b/bin/omarchy-agent @@ -52,7 +52,7 @@ if omarchy-cmd-missing "$agent"; then fi # Agents launched from the keybinding or menu run unattended, so each one starts -# with its own spelling of "don't stop to ask". Pi has no approval prompts. +# with its own spelling of "don't stop to ask". Pi and Ori have none to skip. case "$agent" in opencode) command=(opencode --auto) @@ -90,6 +90,11 @@ omp) command=(omp --auto-approve) [[ -n ${prompt:-} ]] && command+=(-- "$prompt") ;; +ori) + # Ori is a harness launcher, and `ori code` is the agent it runs itself. + command=(ori code) + [[ -n ${prompt:-} ]] && command+=(--prompt "$prompt") + ;; pi) command=(pi) [[ -n ${prompt:-} ]] && command+=("$prompt") diff --git a/bin/omarchy-default-agent b/bin/omarchy-default-agent index 3ff91358..1f89b765 100755 --- a/bin/omarchy-default-agent +++ b/bin/omarchy-default-agent @@ -1,7 +1,7 @@ #!/bin/bash # omarchy:summary=Set and launch the default coding agent -# omarchy:args=[pi|omp|opencode|claude|codex|grok|agy|copilot|crush] +# omarchy:args=[pi|omp|opencode|ori|claude|codex|grok|agy|copilot|crush] # omarchy:examples=omarchy default agent | omarchy default agent codex | omarchy default agent claude installing=false @@ -27,6 +27,7 @@ case "$1" in pi) agent="pi"; name="Pi" ;; omp | oh-my-pi) agent="omp"; name="Oh My Pi"; agent_package="github:can1357/oh-my-pi" ;; opencode | open-code) agent="opencode"; name="OpenCode" ;; +ori | openrouter) agent="ori"; name="Ori"; agent_package="github:OpenRouterLabs/ori-releases" ;; claude | claude-code) agent="claude"; name="Claude Code" ;; codex) agent="codex"; name="Codex" ;; crush) agent="crush"; name="Crush" ;; @@ -34,7 +35,7 @@ grok) agent="grok"; name="Grok"; agent_package="npm:@xai-official/grok" ;; agy | antigravity | antigravity-cli | gemini | gemini-cli) agent="agy"; name="Antigravity"; agent_package="antigravity-cli" ;; copilot | github-copilot) agent="copilot"; name="GitHub Copilot" ;; *) - echo "Usage: omarchy-default-agent " + echo "Usage: omarchy-default-agent " exit 1 ;; esac diff --git a/bin/omarchy-remove-preinstalls b/bin/omarchy-remove-preinstalls index 6b2c6ed1..c096ca2e 100755 --- a/bin/omarchy-remove-preinstalls +++ b/bin/omarchy-remove-preinstalls @@ -15,7 +15,7 @@ if gum confirm "Are you sure you want to remove all preinstalled web apps, TUI w # Remove mise stubs rm -f ~/.local/bin/codex ~/.local/bin/claude ~/.local/bin/agy ~/.local/bin/copilot \ ~/.local/bin/gh ~/.local/bin/opencode ~/.local/bin/playwright ~/.local/bin/playwright-cli ~/.local/bin/pi \ - ~/.local/bin/omp ~/.local/bin/grok ~/.local/bin/crush ~/.local/bin/ghui ~/.local/bin/hunk + ~/.local/bin/omp ~/.local/bin/ori ~/.local/bin/grok ~/.local/bin/crush ~/.local/bin/ghui ~/.local/bin/hunk omarchy-pkg-drop \ aether \ diff --git a/default/fonts/omarchy/README.md b/default/fonts/omarchy/README.md index fe2e2f26..005fc874 100644 --- a/default/fonts/omarchy/README.md +++ b/default/fonts/omarchy/README.md @@ -11,6 +11,7 @@ The private-use glyphs in `omarchy.ttf` are: - `U+E906` — LM Studio, from - `U+E907` — Ollama, from - `U+E908` — T3 Code, traced from the app icon in , since upstream publishes no monochrome SVG +- `U+E909` — Ori, from , OpenRouter's own mark: Ori ships no separate logo and its product page uses this one The agent marks are monochrome so the menu can render them using the active theme's foreground and selection colors. diff --git a/default/fonts/omarchy/omarchy.ttf b/default/fonts/omarchy/omarchy.ttf index 2905c95b..fc47d013 100644 Binary files a/default/fonts/omarchy/omarchy.ttf and b/default/fonts/omarchy/omarchy.ttf differ diff --git a/default/omarchy/omarchy-menu.jsonc b/default/omarchy/omarchy-menu.jsonc index 0ad5dbfb..3a24759b 100644 --- a/default/omarchy/omarchy-menu.jsonc +++ b/default/omarchy/omarchy-menu.jsonc @@ -143,6 +143,7 @@ "setup.default.agent.grok": {"icon":"","iconFont":"omarchy","label":"Grok","checked":"[[ \"$(omarchy-default-agent)\" == \"grok\" ]]","action":"omarchy-default-agent grok"}, "setup.default.agent.omp": {"icon":"","iconFont":"omarchy","label":"omp","checked":"[[ \"$(omarchy-default-agent)\" == \"omp\" ]]","action":"omarchy-default-agent omp"}, "setup.default.agent.opencode": {"icon":"","iconFont":"omarchy","label":"OpenCode","checked":"[[ \"$(omarchy-default-agent)\" == \"opencode\" ]]","action":"omarchy-default-agent opencode"}, + "setup.default.agent.ori": {"icon":"","iconFont":"omarchy","label":"Ori","checked":"[[ \"$(omarchy-default-agent)\" == \"ori\" ]]","action":"omarchy-default-agent ori"}, "setup.default.agent.pi": {"icon":"","iconFont":"omarchy","label":"Pi","checked":"[[ \"$(omarchy-default-agent)\" == \"pi\" ]]","action":"omarchy-default-agent pi"}, "setup.default.browser": {"icon":"","label":"Browser","title":"Default Browser"}, "setup.default.browser.chromium": {"icon":"","label":"Chromium","checked":"[[ \"$(omarchy-default-browser)\" == \"chromium\" ]]","action":"omarchy-default-browser chromium"}, diff --git a/install/user/mise.sh b/install/user/mise.sh index 6653cec4..0c8ab99b 100644 --- a/install/user/mise.sh +++ b/install/user/mise.sh @@ -12,3 +12,4 @@ omarchy-mise-install npm:@xai-official/grok grok omarchy-mise-install npm:@kitlangton/ghui ghui omarchy-mise-install aqua:modem-dev/hunk hunk omarchy-mise-install github:basecamp/hey-cli hey +omarchy-mise-install github:OpenRouterLabs/ori-releases ori diff --git a/manual/17-ai.md b/manual/17-ai.md index a0fc17f4..f5516b88 100644 --- a/manual/17-ai.md +++ b/manual/17-ai.md @@ -13,6 +13,9 @@ Omarchy treats AI coding agents as first-class citizens, but it doesn't pick a f | `grok` | Grok CLI from xAI | | `pi` | [Mario Zechner's Pi](https://github.com/badlogic/pi-mono) | | `omp` | [Oh My Pi](https://github.com/can1357/oh-my-pi) | +| `ori` | [Ori](https://openrouter.ai/docs/guides/ori/harness), OpenRouter's harness | + +`ori` is the odd one out: it runs the other harnesses against OpenRouter's whole model catalog, so `ori claude`, `ori codex`, or `ori opencode` start those agents on whichever model you point them at, and `ori code` is Ori's own agent. To wrap an additional CLI the same way, run `omarchy-mise-install [command-name]`. The stubs are kept current along with everything else mise manages when you run `omarchy update` (or the `mup` alias). diff --git a/migrations/1787342993.sh b/migrations/1787342993.sh new file mode 100644 index 00000000..0358b527 --- /dev/null +++ b/migrations/1787342993.sh @@ -0,0 +1,5 @@ +echo "Install ori (OpenRouter's agent harness) via mise wrapper" + +if [[ ! -f $HOME/.local/state/omarchy/preinstalls-removed ]]; then + omarchy-mise-install github:OpenRouterLabs/ori-releases ori +fi diff --git a/test/shell.d/default-agent-test.sh b/test/shell.d/default-agent-test.sh index 0445106d..5b4512f1 100644 --- a/test/shell.d/default-agent-test.sh +++ b/test/shell.d/default-agent-test.sh @@ -97,6 +97,7 @@ grok_package="npm:@xai-official/grok" omp_package="github:can1357/oh-my-pi" crush_package="crush" agy_package="antigravity-cli" +ori_package="github:OpenRouterLabs/ori-releases" assert_lazy_stub() { local package=$1 @@ -114,6 +115,7 @@ assert_lazy_stub() { assert_lazy_stub "$grok_package" grok assert_lazy_stub "$omp_package" omp assert_lazy_stub "$crush_package" crush +assert_lazy_stub "$ori_package" ori pass "custom agent lazy stubs preserve their mise packages" source "$ROOT/install/user/mise.sh" @@ -121,12 +123,17 @@ grep -Fx "$agy_package agy" "$stub_log" >/dev/null || fail "user setup creates t grep -Fx "$grok_package grok" "$stub_log" >/dev/null || fail "user setup creates the Grok lazy stub" grep -Fx "$omp_package omp" "$stub_log" >/dev/null || fail "user setup creates the Oh My Pi lazy stub" grep -Fx "$crush_package" "$stub_log" >/dev/null || fail "user setup creates the Crush lazy stub" +grep -Fx "$ori_package ori" "$stub_log" >/dev/null || fail "user setup creates the Ori lazy stub" pass "user setup creates the custom agent lazy stubs" : >"$stub_log" source "$ROOT/migrations/1785617047.sh" >/dev/null grep -Fx "$omp_package omp" "$stub_log" >/dev/null || fail "Oh My Pi migration creates a working lazy stub" +: >"$stub_log" +source "$ROOT/migrations/1787342993.sh" >/dev/null +grep -Fx "$ori_package ori" "$stub_log" >/dev/null || fail "Ori migration creates a working lazy stub" + : >"$stub_log" source "$ROOT/migrations/1785846769.sh" >/dev/null grep -Fx "$omp_package omp" "$stub_log" >/dev/null || fail "agent migration repairs the Oh My Pi lazy stub" @@ -208,6 +215,7 @@ touch "$test_home/.local/state/omarchy/preinstalls-removed" : >"$stub_log" source "$ROOT/migrations/1785617047.sh" >/dev/null source "$ROOT/migrations/1785846769.sh" >/dev/null +source "$ROOT/migrations/1787342993.sh" >/dev/null [[ ! -s $stub_log ]] || fail "agent migrations respect the preinstall opt-out" [[ ! -e $test_home/.local/bin/omp ]] || fail "agent migration removes the obsolete Oh My Pi wrapper after opt-out" @@ -232,9 +240,9 @@ rm "$test_home/.local/state/omarchy/preinstalls-removed" rm -f "$agent_file" pass "agent migrations install working wrappers without overriding the preinstall opt-out" -touch "$test_home/.local/bin/agy" +touch "$test_home/.local/bin/agy" "$test_home/.local/bin/ori" omarchy-remove-preinstalls >/dev/null -for command in agy omp grok crush; do +for command in agy omp ori grok crush; do [[ ! -e $test_home/.local/bin/$command ]] || fail "Remove Preinstalls deletes the $command lazy stub" done pass "Remove Preinstalls deletes every optional agent lazy stub" @@ -285,6 +293,8 @@ declare -A expected_agents=( [oh-my-pi]="omp" [opencode]="opencode" [open-code]="opencode" + [ori]="ori" + [openrouter]="ori" [claude]="claude" [claude-code]="claude" [codex]="codex" @@ -303,6 +313,7 @@ declare -A expected_packages=( [pi]="pi" [omp]="$omp_package" [opencode]="opencode" + [ori]="$ori_package" [claude]="claude" [codex]="codex" [crush]="$crush_package" @@ -446,6 +457,7 @@ assert_bypass() { assert_launch pi pi "Review this project" assert_launch omp omp --auto-approve -- "Review this project" assert_launch opencode opencode --auto --prompt "Review this project" +assert_launch ori ori code --prompt "Review this project" assert_launch claude claude --permission-mode auto -- "Review this project" assert_launch codex codex --approve-for-me -- "Review this project" assert_launch crush crush run "Review this project" @@ -457,6 +469,7 @@ pass "agent launcher adapts initial prompts for every supported agent" assert_bypass pi pi assert_bypass omp omp --auto-approve assert_bypass opencode opencode --auto +assert_bypass ori ori code assert_bypass claude claude --permission-mode auto assert_bypass codex codex --approve-for-me assert_bypass crush crush --yolo diff --git a/test/shell.d/menu-test.sh b/test/shell.d/menu-test.sh index 236831c3..b3394678 100644 --- a/test/shell.d/menu-test.sh +++ b/test/shell.d/menu-test.sh @@ -220,6 +220,7 @@ const expectedAgents = { pi: { icon: '\ue901', iconFont: 'omarchy', label: 'Pi' }, omp: { icon: '\ue903', iconFont: 'omarchy', label: 'omp' }, opencode: { icon: '\ue902', iconFont: 'omarchy', label: 'OpenCode' }, + ori: { icon: '\ue909', iconFont: 'omarchy', label: 'Ori' }, claude: { icon: '󰛄', label: 'Claude' }, codex: { icon: '\ue905', iconFont: 'omarchy', label: 'Codex' }, grok: { icon: '\ue904', iconFont: 'omarchy', label: 'Grok' }, @@ -243,7 +244,7 @@ assertDeepEqual( defaultItems .filter(item => item.parent === 'setup.default.agent') .map(item => item.label), - ['Antigravity', 'Claude', 'Codex', 'Copilot', 'Crush', 'Grok', 'omp', 'OpenCode', 'Pi'], + ['Antigravity', 'Claude', 'Codex', 'Copilot', 'Crush', 'Grok', 'omp', 'OpenCode', 'Ori', 'Pi'], 'menu sorts coding agents alphabetically' ) const expectedDefaults = { @@ -635,5 +636,5 @@ assert( JS font_charset=$(fc-query --format='%{charset}' "$ROOT/default/fonts/omarchy/omarchy.ttf") -[[ $font_charset == *"e900-e908"* ]] || fail "Omarchy icon font includes every custom menu glyph" +[[ $font_charset == *"e900-e909"* ]] || fail "Omarchy icon font includes every custom menu glyph" pass "Omarchy icon font includes the official agent marks"