From 884ee6943a5ae8e71d45fd6a2c251b146f867993 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 4 Aug 2026 10:04:21 -0700 Subject: [PATCH] Use official agent marks in default menu --- default/fonts/omarchy/README.md | 13 +++++++++++++ default/fonts/omarchy/omarchy.ttf | Bin 1824 -> 2572 bytes default/omarchy/omarchy-menu.jsonc | 10 +++++----- test/shell.d/menu-test.sh | 15 ++++++++++----- 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 default/fonts/omarchy/README.md diff --git a/default/fonts/omarchy/README.md b/default/fonts/omarchy/README.md new file mode 100644 index 00000000..8eb3c441 --- /dev/null +++ b/default/fonts/omarchy/README.md @@ -0,0 +1,13 @@ +# Omarchy icon font + +The private-use glyphs in `omarchy.ttf` are: + +- `U+E900` — Omarchy +- `U+E901` — Pi, from +- `U+E902` — OpenCode, from +- `U+E903` — omp, from +- `U+E904` — Grok, from +- `U+E905` — Codex, from the OpenAI mark on + +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 273256d07549caa5de9121fc13110e9b704b63d5..a548aec1c293fdc3c3927afaa2084703a37a2348 100644 GIT binary patch literal 2572 zcmc&$Z){Ul6hHU9wy%Gnbo9@IF{Eo*OXk*Y?b^rRF_3kjSpIDwG6P-rx`F+dQV0`N zrU?m#WFn|IqGI%m5+z}N#AF`~QGpnjm>4y(4~j0vXpAO)V4c7F`XmGVYP`4So^yWZ zocqqb@4S0UjEHP>oJ4Br+R?M#d$nPN$Z`Q_cFT@%Wak%~x`^0v==;*SRPopI7oLIs z36WqQ$PQ(0|Mql=Nc;=*)S#N`51p6;nXZ81g8zU9jue@f-hzDrbZnxE}26nAjI9MLOn7)PlI$+;RJa-n2 z<}Yvla__v=f0E4rfav?rKRv|xtyiz@;M{b zq7%(<70o~;_97W!Iw@R-K2qiEXNoYy2xJsBzx#%*na+M1r_@w6hh9Uk=5lui63439 z-8aD<0QL?Vr5wf%fXD@Jk*Ep8Lr-aIAY>zIQWH2|!6{hxfxE~7#6T%Z(;#LkP>F`7 zXv#Rl*LW|=W@cvIMt^hWm6BQlfC)hEFF?lwnLkLjQVJf#!QE3K0Wd{8I8-keT+ z4F#R}zN5Z0;_DmI2|GLmkrU5hiW9fvS&Yy7UpE73PtjhJ$g6`t9IaX{Rr&uP*U;Vl zaqQ~}Y}Q9eO-oq&GHfK%B3eRzBBkD4UxOY4F_5PDV^J1$`<)=p6YS>nHwLPd*v8wZ z#L)BtcD`~^=uMujq?1V@nXCjSCK3q)-KKPPIcoOFDdIAoy;!OMg2zMXr*V(GM_O}U%xvYR_#9b>gSI}!V$L6=~9-|cjto?~C+ai)U%qr`a2lw{v@%e*-tHtIr*G8j}XJ1&? zvaQQEKj35*)LsW|z`kC=cfEu{6r)b+rUAnF$zpAa5|2ha9=FRS1p|^Z))ovZaarbw zNooiNVzIV3JY>n_u91T=MRrS0A6#NJvd0Y{lfN|>3bf|9SQ${q!fB*8la8vY6j%XkH$! ztlea8O13JYOODqE(H`Q`CQEa&bprMkVaIpyv_`fxGxmYQag$H-ZG2C=t@Yt$!KLPQ zbyb7!fvwH=Bf?O(&DiH`Nj4d+rU9$968~(z<+(%TQS z6PSo)Y{eVt!DAnxUOLYV%*ad(Z(H9*bD^l_(}jLjEaZxYfl}c~BiD{pE5k}H)K0>N z#O7|YXH(@o)!zAY!0^z2{wQ#nW%m!Hw0lU?VB=N>gi)Q&4d4>qr2)49uOV(@B>WBT CGLoPG delta 787 zcmZvYF=!M~5QhKR+r8V}lS|M`2q<#mMI|1|MO0FV+Nq!j1`k9~*UOp>?A{)C3FK6~ zA{K&I7*;IOXpz!N!9olcT4-ggY*Q#=uaYkQZ}Y$e@`ho)nRzqw-t>wu3Qq>RG65jG zJUMo(_VvO!K$hv>sz+Y))#LsiU>u>k(_!b%`=td7FwZl8Kk&V&%F4H&JRdpGroWMJjV=_U0fU53kPNJtvm+Rr2resMe^K< zk_ma(C94}5YK6*1vXu4*o-(Q?RcKksxQT%NZuB!^z(bvWgcvP!eqlp(-YLfLmLshH zF9QnI*er5sQwuia^{SDRzFlcmQ`g$blySS5I;XKslJ(5Jq@5e-7WBhS_8QP^A&-5U z)eJ5=?cw4mMm6WL2iMeRO|{wrLd^#GuI3E+k!F+pOtXbSEN}8fexiW4I^m**Pnz>M zB>UsYYt@6!6@Pjz^jg}}rslWWGjXFdK3dh0WYWHVCgyfMZddKO!#!{HYVet9V}|ht vN*L#Ns@v}*AM6LoS?9o*BZg$e6ic#_6I&c{k<)`DmPkBlNnHZzq`UbCU?YRJ diff --git a/default/omarchy/omarchy-menu.jsonc b/default/omarchy/omarchy-menu.jsonc index 203318d9..2806fe12 100644 --- a/default/omarchy/omarchy-menu.jsonc +++ b/default/omarchy/omarchy-menu.jsonc @@ -133,14 +133,14 @@ "setup.default": {"icon":"","label":"Defaults","aliases":["default","defaults"]}, "setup.default.agent": {"icon":"󰚩","label":"Agent"}, "setup.default.agent.claude": {"icon":"󰛄","label":"Claude","checked":"[[ \"$(omarchy-default-agent)\" == \"claude\" ]]","action":"omarchy-default-agent claude"}, - "setup.default.agent.codex": {"icon":"󰞵","label":"Codex","checked":"[[ \"$(omarchy-default-agent)\" == \"codex\" ]]","action":"omarchy-default-agent codex"}, + "setup.default.agent.codex": {"icon":"","iconFont":"omarchy","label":"Codex","checked":"[[ \"$(omarchy-default-agent)\" == \"codex\" ]]","action":"omarchy-default-agent codex"}, "setup.default.agent.copilot": {"icon":"","label":"Copilot","checked":"[[ \"$(omarchy-default-agent)\" == \"copilot\" ]]","action":"omarchy-default-agent copilot"}, "setup.default.agent.crush": {"icon":"󰋑","label":"Crush","checked":"[[ \"$(omarchy-default-agent)\" == \"crush\" ]]","action":"omarchy-default-agent crush"}, "setup.default.agent.gemini": {"icon":"󰫢","label":"Gemini","checked":"[[ \"$(omarchy-default-agent)\" == \"gemini\" ]]","action":"omarchy-default-agent gemini"}, - "setup.default.agent.grok": {"icon":"󰰱","label":"Grok","checked":"[[ \"$(omarchy-default-agent)\" == \"grok\" ]]","action":"omarchy-default-agent grok"}, - "setup.default.agent.omp": {"icon":"󰣪","label":"omp","checked":"[[ \"$(omarchy-default-agent)\" == \"omp\" ]]","action":"omarchy-default-agent omp"}, - "setup.default.agent.opencode": {"icon":"󰕪","label":"OpenCode","checked":"[[ \"$(omarchy-default-agent)\" == \"opencode\" ]]","action":"omarchy-default-agent opencode"}, - "setup.default.agent.pi": {"icon":"󰏿","label":"Pi","checked":"[[ \"$(omarchy-default-agent)\" == \"pi\" ]]","action":"omarchy-default-agent pi"}, + "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.pi": {"icon":"","iconFont":"omarchy","label":"Pi","checked":"[[ \"$(omarchy-default-agent)\" == \"pi\" ]]","action":"omarchy-default-agent pi"}, "setup.default.browser": {"icon":"","label":"Browser"}, "setup.default.browser.chromium": {"icon":"","label":"Chromium","when":"omarchy-cmd-present chromium","checked":"[[ \"$(omarchy-default-browser)\" == \"chromium\" ]]","action":"omarchy-default-browser chromium"}, "setup.default.browser.chrome": {"icon":"󰊯","label":"Chrome","when":"omarchy-cmd-present google-chrome-stable","checked":"[[ \"$(omarchy-default-browser)\" == \"chrome\" ]]","action":"omarchy-default-browser chrome"}, diff --git a/test/shell.d/menu-test.sh b/test/shell.d/menu-test.sh index d7621e18..ccb8ce7f 100644 --- a/test/shell.d/menu-test.sh +++ b/test/shell.d/menu-test.sh @@ -168,12 +168,12 @@ assertEqual( 'menu lists Direct Boot immediately below Input' ) const expectedAgents = { - pi: { icon: '󰏿', label: 'Pi' }, - omp: { icon: '󰣪', label: 'omp' }, - opencode: { icon: '󰕪', label: 'OpenCode' }, + pi: { icon: '\ue901', iconFont: 'omarchy', label: 'Pi' }, + omp: { icon: '\ue903', iconFont: 'omarchy', label: 'omp' }, + opencode: { icon: '\ue902', iconFont: 'omarchy', label: 'OpenCode' }, claude: { icon: '󰛄', label: 'Claude' }, - codex: { icon: '󰞵', label: 'Codex' }, - grok: { icon: '󰰱', label: 'Grok' }, + codex: { icon: '\ue905', iconFont: 'omarchy', label: 'Codex' }, + grok: { icon: '\ue904', iconFont: 'omarchy', label: 'Grok' }, gemini: { icon: '󰫢', label: 'Gemini' }, copilot: { icon: '', label: 'Copilot' }, crush: { icon: '󰋑', label: 'Crush' }, @@ -183,6 +183,7 @@ assert( const entry = defaultById[`setup.default.agent.${agent}`] return entry && entry.icon === expected.icon + && entry.iconFont === (expected.iconFont || '') && entry.label === expected.label && entry.action === `omarchy-default-agent ${agent}` && !entry.when @@ -483,3 +484,7 @@ assert( 'mouse activation carries pointer intent into subordinate menus' ) JS + +font_charset=$(fc-query --format='%{charset}' "$ROOT/default/fonts/omarchy/omarchy.ttf") +[[ $font_charset == *"e900-e905"* ]] || fail "Omarchy icon font includes every custom menu glyph" +pass "Omarchy icon font includes the official agent marks"