Add Ori as a lazy-loaded agent and a default-agent choice (#7709)

Ori is OpenRouter's harness: `ori claude`, `ori codex` and `ori opencode` start those agents against OpenRouter's model catalogue, and `ori code` is Ori's own agent. That last one is what the default-agent entry launches, bare — Ori has no approval prompt to skip, so there is no "don't stop to ask" flag to pass it the way the other agents get one.

The package is `github:OpenRouterLabs/ori-releases`, because upstream ships prebuilt binaries as release assets and publishes nothing to npm. mise's `github` backend picks the right asset per platform and verifies GitHub's artifact attestations on the way in; `ubi` resolves the same release but is deprecated for removal in mise 2027.1.

The menu glyph at U+E909 is OpenRouter's own mark. Ori publishes no logo of its own and its product page renders that one, so there was no Ori-specific mark to prefer over it.

Co-authored-by: Codex XHigh <noreply@openai.com>
This commit is contained in:
Omarchybot
2026-08-23 11:44:23 +02:00
committed by GitHub
co-authored by Codex XHigh
parent 2c247e390e
commit 1cc5c72e2c
11 changed files with 39 additions and 8 deletions
+6 -1
View File
@@ -52,7 +52,7 @@ if omarchy-cmd-missing "$agent"; then
fi fi
# Agents launched from the keybinding or menu run unattended, so each one starts # 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 case "$agent" in
opencode) opencode)
command=(opencode --auto) command=(opencode --auto)
@@ -90,6 +90,11 @@ omp)
command=(omp --auto-approve) command=(omp --auto-approve)
[[ -n ${prompt:-} ]] && command+=(-- "$prompt") [[ -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) pi)
command=(pi) command=(pi)
[[ -n ${prompt:-} ]] && command+=("$prompt") [[ -n ${prompt:-} ]] && command+=("$prompt")
+3 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# omarchy:summary=Set and launch the default coding agent # 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 # omarchy:examples=omarchy default agent | omarchy default agent codex | omarchy default agent claude
installing=false installing=false
@@ -27,6 +27,7 @@ case "$1" in
pi) agent="pi"; name="Pi" ;; pi) agent="pi"; name="Pi" ;;
omp | oh-my-pi) agent="omp"; name="Oh My Pi"; agent_package="github:can1357/oh-my-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" ;; 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" ;; claude | claude-code) agent="claude"; name="Claude Code" ;;
codex) agent="codex"; name="Codex" ;; codex) agent="codex"; name="Codex" ;;
crush) agent="crush"; name="Crush" ;; 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" ;; agy | antigravity | antigravity-cli | gemini | gemini-cli) agent="agy"; name="Antigravity"; agent_package="antigravity-cli" ;;
copilot | github-copilot) agent="copilot"; name="GitHub Copilot" ;; copilot | github-copilot) agent="copilot"; name="GitHub Copilot" ;;
*) *)
echo "Usage: omarchy-default-agent <pi|omp|opencode|claude|codex|grok|agy|copilot|crush>" echo "Usage: omarchy-default-agent <pi|omp|opencode|ori|claude|codex|grok|agy|copilot|crush>"
exit 1 exit 1
;; ;;
esac esac
+1 -1
View File
@@ -15,7 +15,7 @@ if gum confirm "Are you sure you want to remove all preinstalled web apps, TUI w
# Remove mise stubs # Remove mise stubs
rm -f ~/.local/bin/codex ~/.local/bin/claude ~/.local/bin/agy ~/.local/bin/copilot \ 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/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 \ omarchy-pkg-drop \
aether \ aether \
+1
View File
@@ -11,6 +11,7 @@ The private-use glyphs in `omarchy.ttf` are:
- `U+E906` — LM Studio, from <https://simpleicons.org/icons/lmstudio.svg> - `U+E906` — LM Studio, from <https://simpleicons.org/icons/lmstudio.svg>
- `U+E907` — Ollama, from <https://simpleicons.org/icons/ollama.svg> - `U+E907` — Ollama, from <https://simpleicons.org/icons/ollama.svg>
- `U+E908` — T3 Code, traced from the app icon in <https://aur.archlinux.org/cgit/aur.git/plain/t3code-icon.png?h=t3code-bin>, since upstream publishes no monochrome SVG - `U+E908` — T3 Code, traced from the app icon in <https://aur.archlinux.org/cgit/aur.git/plain/t3code-icon.png?h=t3code-bin>, since upstream publishes no monochrome SVG
- `U+E909` — Ori, from <https://openrouter.ai/brand/v2/openrouter-glyph-dark.svg>, 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 The agent marks are monochrome so the menu can render them using the active
theme's foreground and selection colors. theme's foreground and selection colors.
Binary file not shown.
+1
View File
@@ -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.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.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.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.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": {"icon":"","label":"Browser","title":"Default Browser"},
"setup.default.browser.chromium": {"icon":"","label":"Chromium","checked":"[[ \"$(omarchy-default-browser)\" == \"chromium\" ]]","action":"omarchy-default-browser chromium"}, "setup.default.browser.chromium": {"icon":"","label":"Chromium","checked":"[[ \"$(omarchy-default-browser)\" == \"chromium\" ]]","action":"omarchy-default-browser chromium"},
+1
View File
@@ -12,3 +12,4 @@ omarchy-mise-install npm:@xai-official/grok grok
omarchy-mise-install npm:@kitlangton/ghui ghui omarchy-mise-install npm:@kitlangton/ghui ghui
omarchy-mise-install aqua:modem-dev/hunk hunk omarchy-mise-install aqua:modem-dev/hunk hunk
omarchy-mise-install github:basecamp/hey-cli hey omarchy-mise-install github:basecamp/hey-cli hey
omarchy-mise-install github:OpenRouterLabs/ori-releases ori
+3
View File
@@ -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 | | `grok` | Grok CLI from xAI |
| `pi` | [Mario Zechner's Pi](https://github.com/badlogic/pi-mono) | | `pi` | [Mario Zechner's Pi](https://github.com/badlogic/pi-mono) |
| `omp` | [Oh My Pi](https://github.com/can1357/oh-my-pi) | | `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 <package> [command-name]`. The stubs are kept current along with everything else mise manages when you run `omarchy update` (or the `mup` alias). To wrap an additional CLI the same way, run `omarchy-mise-install <package> [command-name]`. The stubs are kept current along with everything else mise manages when you run `omarchy update` (or the `mup` alias).
+5
View File
@@ -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
+15 -2
View File
@@ -97,6 +97,7 @@ grok_package="npm:@xai-official/grok"
omp_package="github:can1357/oh-my-pi" omp_package="github:can1357/oh-my-pi"
crush_package="crush" crush_package="crush"
agy_package="antigravity-cli" agy_package="antigravity-cli"
ori_package="github:OpenRouterLabs/ori-releases"
assert_lazy_stub() { assert_lazy_stub() {
local package=$1 local package=$1
@@ -114,6 +115,7 @@ assert_lazy_stub() {
assert_lazy_stub "$grok_package" grok assert_lazy_stub "$grok_package" grok
assert_lazy_stub "$omp_package" omp assert_lazy_stub "$omp_package" omp
assert_lazy_stub "$crush_package" crush assert_lazy_stub "$crush_package" crush
assert_lazy_stub "$ori_package" ori
pass "custom agent lazy stubs preserve their mise packages" pass "custom agent lazy stubs preserve their mise packages"
source "$ROOT/install/user/mise.sh" 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 "$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 "$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 "$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" pass "user setup creates the custom agent lazy stubs"
: >"$stub_log" : >"$stub_log"
source "$ROOT/migrations/1785617047.sh" >/dev/null 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" 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" : >"$stub_log"
source "$ROOT/migrations/1785846769.sh" >/dev/null 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" 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" : >"$stub_log"
source "$ROOT/migrations/1785617047.sh" >/dev/null source "$ROOT/migrations/1785617047.sh" >/dev/null
source "$ROOT/migrations/1785846769.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" [[ ! -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" [[ ! -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" rm -f "$agent_file"
pass "agent migrations install working wrappers without overriding the preinstall opt-out" 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 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" [[ ! -e $test_home/.local/bin/$command ]] || fail "Remove Preinstalls deletes the $command lazy stub"
done done
pass "Remove Preinstalls deletes every optional agent lazy stub" pass "Remove Preinstalls deletes every optional agent lazy stub"
@@ -285,6 +293,8 @@ declare -A expected_agents=(
[oh-my-pi]="omp" [oh-my-pi]="omp"
[opencode]="opencode" [opencode]="opencode"
[open-code]="opencode" [open-code]="opencode"
[ori]="ori"
[openrouter]="ori"
[claude]="claude" [claude]="claude"
[claude-code]="claude" [claude-code]="claude"
[codex]="codex" [codex]="codex"
@@ -303,6 +313,7 @@ declare -A expected_packages=(
[pi]="pi" [pi]="pi"
[omp]="$omp_package" [omp]="$omp_package"
[opencode]="opencode" [opencode]="opencode"
[ori]="$ori_package"
[claude]="claude" [claude]="claude"
[codex]="codex" [codex]="codex"
[crush]="$crush_package" [crush]="$crush_package"
@@ -446,6 +457,7 @@ assert_bypass() {
assert_launch pi pi "Review this project" assert_launch pi pi "Review this project"
assert_launch omp omp --auto-approve -- "Review this project" assert_launch omp omp --auto-approve -- "Review this project"
assert_launch opencode opencode --auto --prompt "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 claude claude --permission-mode auto -- "Review this project"
assert_launch codex codex --approve-for-me -- "Review this project" assert_launch codex codex --approve-for-me -- "Review this project"
assert_launch crush crush run "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 pi pi
assert_bypass omp omp --auto-approve assert_bypass omp omp --auto-approve
assert_bypass opencode opencode --auto assert_bypass opencode opencode --auto
assert_bypass ori ori code
assert_bypass claude claude --permission-mode auto assert_bypass claude claude --permission-mode auto
assert_bypass codex codex --approve-for-me assert_bypass codex codex --approve-for-me
assert_bypass crush crush --yolo assert_bypass crush crush --yolo
+3 -2
View File
@@ -220,6 +220,7 @@ const expectedAgents = {
pi: { icon: '\ue901', iconFont: 'omarchy', label: 'Pi' }, pi: { icon: '\ue901', iconFont: 'omarchy', label: 'Pi' },
omp: { icon: '\ue903', iconFont: 'omarchy', label: 'omp' }, omp: { icon: '\ue903', iconFont: 'omarchy', label: 'omp' },
opencode: { icon: '\ue902', iconFont: 'omarchy', label: 'OpenCode' }, opencode: { icon: '\ue902', iconFont: 'omarchy', label: 'OpenCode' },
ori: { icon: '\ue909', iconFont: 'omarchy', label: 'Ori' },
claude: { icon: '󰛄', label: 'Claude' }, claude: { icon: '󰛄', label: 'Claude' },
codex: { icon: '\ue905', iconFont: 'omarchy', label: 'Codex' }, codex: { icon: '\ue905', iconFont: 'omarchy', label: 'Codex' },
grok: { icon: '\ue904', iconFont: 'omarchy', label: 'Grok' }, grok: { icon: '\ue904', iconFont: 'omarchy', label: 'Grok' },
@@ -243,7 +244,7 @@ assertDeepEqual(
defaultItems defaultItems
.filter(item => item.parent === 'setup.default.agent') .filter(item => item.parent === 'setup.default.agent')
.map(item => item.label), .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' 'menu sorts coding agents alphabetically'
) )
const expectedDefaults = { const expectedDefaults = {
@@ -635,5 +636,5 @@ assert(
JS JS
font_charset=$(fc-query --format='%{charset}' "$ROOT/default/fonts/omarchy/omarchy.ttf") 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" pass "Omarchy icon font includes the official agent marks"