Skip to content

feat(native-chat): $ opens Codex skills in the composer - #30827

Merged
brennanb2025 merged 4 commits into
mainfrom
brennanb2025/codex-dollar-skill-picker
Oct 19, 2026
Merged

brennanb2025 merged 4 commits into
mainfrom
brennanb2025/codex-dollar-skill-picker

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 1 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​50 $\color{#cf222e}{\Huge{\mathbf{−}}}$​4 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​46
Prod 2 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​66 $\color{#cf222e}{\Huge{\mathbf{−}}}$​27 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​39

ELI5

In a Codex chat, typing $ did nothing. Codex users are used to $ opening a list of their skills (it does in Codex's own terminal and desktop apps), so when nothing appeared they concluded skills don't work in Orca. Now $ opens a list of just the skills in Codex chats. / still works exactly as before.

What Changed

  • Before: in a Codex chat, skills were only reachable through /, which lists commands and skills together. Typing $ opened nothing.
  • After: in a Codex chat, $ (at the start of the message or after a space) opens a skills-only list with no command rows and no group headings. Picking a skill inserts $name, the form Codex runs. / is unchanged: it still lists commands and skills for every agent.
  • Other agents (Claude, OpenCode, Grok…) keep $ as plain text. Only an agent whose skills use the $ sign opens the list on it. Today that is just Codex.
  • Mechanism: the chat box's existing picker gains a second trigger. It reuses the same skill catalog, ranking, insertion and dismissal. A $ list never sends a command on Enter; it only completes the skill name.
  • $ in ordinary text stays text, using the same rule as Codex's own composer: common environment variables ($HOME, $PATH, $USER…), digits ($5), and $(, ${, $? never open the list, so echo $HOME + Enter sends the message. A $ list matches skill names only, not their descriptions, so echo $CODEX_HOME doesn't turn into a skill whose description mentions it. / keeps matching descriptions.

Why

The report in #30813 says typing $skill in a Codex chat doesn't run the skill. I checked that path before changing anything. I ran a real codex app-server (codex-cli 0.162.1) with a throwaway home laid out like Orca's (skills folder linked in the same way) and sent a turn containing only the plain text $orca-probe-skill, the same input Orca sends. Codex loaded the skill and answered with its marker text. So a hand-typed $name already reaches the skill; what was missing is the list that Codex users expect $ to open.

Earlier, #19832 deliberately made / the only trigger, so every agent's chat box works the same. This PR keeps that: / still shows every command and skill for every agent, and $ is an extra key for Codex only, not a different chat box. That matches the common pattern for skills that use their own sign: $ opens skills only, and a multi-agent composer keeps skills in / as well by default.

Considered and left out:

Plan: two renderer and shared files; no saved data, wire change, process or lifecycle change.

Light-path classification:

  1. Small: 2 production files (src/shared/native-chat-picker-items.ts, src/renderer/src/components/native-chat/native-chat-composer-state.ts), +34/−17 production lines.
  2. Outside the risky areas: composer text matching and picker rendering only; no session ownership or lifecycle, nothing saved to disk, no ordering or retries, no RPC/IPC or wire change, no processes, files, auth, orchestration, packaging, or changed default for existing users (other agents and / are unchanged).
  3. Not a repeat: git log --since=30.days on both files shows only feat(native-chat): /resume in a structured chat opens Agent Session History #28133, feat(mobile): redesign the chat composer with file attachments and inline skills #30359, fix(native-chat): recall every sent prompt with Up/Down in the composer #26044 and feat(native-chat): suggest files on @ and name the triggers #26017, none fixing a $ or skill-trigger symptom, and no reverts.
  4. Local effect: one pure text-matching function plus the composer's autocomplete derivation, covered by native-chat-composer-state.test.ts.

The round-1 reviewer confirmed all four criteria. A second fix round was needed (see Review), so the PR moved to the full review path. The same chat box is also used by the terminal-backed chat view, so $ opens the list there too; on SSH, where Orca can't list skills, it shows the same "Skills can't be listed in SSH chats" row that / already shows there. The mobile chat box has its own autocomplete and is unchanged.

Linked Issue

Tracked in #30813. This adds the $ list and makes picking a skill from it run the skill. A hand-typed or picked $name still doesn't run a skill that comes from a Codex plugin (Codex names those plugin:skill) or one whose name is shared by two skills; both come from Orca listing skills from its own disk scan instead of Codex's own skill report, and are left for a follow-up.

Visual Proof

Real QA on Windows (main e932dfbfbb9 vs this branch 47d17c167b1) with a real Codex and Claude, plus an earlier run on macOS. A throwaway skill qa-marker tells Codex to start its reply with QA-MARKER-30827-OK.

main this branch
Codex, $ main: $ is plain text branch: skills-only list
Codex, echo $CODEX_HOME (built-in skills present) main: no list branch: no skill offered
Codex, / main: commands and skills branch: same

Branch only:

Mid-message please run $qa Picked skill Real Codex reply: the skill ran
filtered list skill pill inserted QA-MARKER-30827-OK
echo $HOME and echo $CODEX_HOME sent unchanged $sk lists skill-creator and skill-installer Claude chat: $ stays plain text
sent unchanged name match claude $ prose

The red "hook exited with code 1" rows appear on main too in these Windows test profiles and are unrelated to this change.

Testing

  • I manually tested these changes locally
  • Automated tests added/updated, or explained why not below

native-chat-composer-state.test.ts pins: $ opens a skills-only list in Codex chats (at the start and mid-message); picking a skill writes $name; Claude keeps $ as prose; echo $HOME, costs $5 and run $(pwd) open nothing; and echo $CODEX_HOME offers no skill through $ while / still finds that skill by its description. The six picker and composer test files pass (94 tests).

Review

Review loop: one adversarial reviewer, then an architecture review and the readiness checklist after the second fix round. Two fix rounds:

  • echo $HOME, $PATH, $USER + Enter replaced the word with a skill instead of sending, and $5 / $(pwd) showed an empty list. Fixed by adopting Codex's own rule for which text after $ is a skill name.
  • echo $CODEX_HOME + Enter still became $skill-installer, because the list also matched descriptions. Fixed by matching skill names only for $, as Codex does.

Agent skill upstream boundary

  • Not applicable, or this change copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

Cross-platform: renderer-only text matching, no platform branches. SSH: no change; native Codex chat runs on the local host only. Mobile: unchanged. Backwards compatibility: no saved data or wire change.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

X: @BrennanKB5

Typing `$` in a Codex chat now opens a skills-only list, as Codex's own
apps do. `/` still lists commands and skills for every agent, and other
agents keep `$` as plain text.
…does

In Codex chats `$HOME`, `$5`, `$(pwd)`, `${X}` and `$?` stay prose instead of opening the skill list, so Enter sends them; one classifier now serves the trigger, the menu and the insert.
A `$` query no longer matches skill descriptions, so `echo $CODEX_HOME` + Enter sends instead of picking skill-installer; `/` still searches descriptions.
@brennanb2025
brennanb2025 marked this pull request as ready for review October 19, 2026 20:55
@coderabbitai

coderabbitai Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 1 minute.

Check out review usage here.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: cf28b1e5-61c6-4f78-b801-5292302a61b4
📥 Commits

Reviewing files that changed from the base of the PR and between e932dfb and 47d17c1.

📒 Files selected for processing: 3
  • src/renderer/src/components/native-chat/native-chat-composer-state.test.ts
  • src/renderer/src/components/native-chat/native-chat-composer-state.ts
  • src/shared/native-chat-picker-items.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@brennanb2025

Copy link
Copy Markdown
Contributor Author

Review loop status: done on 47d17c167b1

The problem. In a Codex chat, typing $ did nothing. Codex's own apps open a skill list on $, so users concluded skills don't work in Orca (#30813). A hand-typed $name already reached Codex, but nothing helped users find or complete it.

What changes for users. In a Codex chat, $ at the start or after a space opens a list of skills only; picking one inserts $name and sending it runs the skill (verified with a real Codex reply). / is unchanged for every agent, and other agents keep $ as plain text. Ordinary text stays text: echo $HOME, $5, $(pwd) and echo $CODEX_HOME send unchanged on Enter.

Fixed during review

  • echo $HOME / $PATH / $USER + Enter swapped the word for a skill instead of sending; $5 and $(pwd) popped an empty list. Now uses the same rule as Codex's own composer for which text after $ is a skill name.
  • echo $CODEX_HOME + Enter still became $skill-installer because the list matched skill descriptions. $ now matches names only, as Codex does; / keeps description matching.
  • The PR text no longer closes [Bug]: Codex Chat UI does not invoke $skill #30813 (see below), and its note about SSH was corrected.

Deferred (not caused by this PR; all also happen through / on main)

  • Skills from a Codex plugin are inserted as a bare $name, but Codex knows them as plugin:skill, so they don't run. Two skills with the same name show as one row and neither runs. Both come from Orca listing skills from its own disk scan instead of Codex's own skill report; that's the follow-up, and why this is "tracked in [Bug]: Codex Chat UI does not invoke $skill #30813", not "fixes".
  • An open chat's skill list is loaded once, so skills Codex adds later (e.g. its built-ins on first start) appear only in a new chat.
  • A skill whose name starts with a digit or - completes through / but not $.
  • Words like $CODEX_HOME or $TODO show an empty "No matching skills" row (Enter still sends; same as Codex). Picking with the caret inside an already-typed word keeps the rest of that word (same on main for /).
  • In an SSH chat, a $name word shows the same "Skills can't be listed in SSH chats" row / already shows there (not exercised).

Verified

  • Real QA on Windows (main e932dfbfbb9 vs 47d17c167b1) and earlier on macOS: $ at start and mid-message, picking and sending with a real Codex reply showing the skill ran, $5 / $HOME / $CODEX_HOME prose, Escape, / unchanged, Claude $ unchanged. Screenshots are in the PR description.
  • 94 targeted tests pass; CI's aggregate "PR checks passed" is green on this head.
  • Not verified: SSH and WSL chats, Linux.
  • Seen on both main and branch, unrelated to this change: in the Windows test profiles, Codex hooks failed ("hook exited with code 1") and the collapsed turn showed only that error, hiding Codex's answer until the turn was expanded.

For Brennan's review

  • Main vs branch screenshots: in the PR description's Visual Proof.
  • src/shared/native-chat-picker-items.ts matchSkillSigil: which $ words open the list. Ported from Codex's own rule, except digit- and --leading names never open.
  • Skills listed from Orca's disk scan rather than Codex's skill report (plugin and duplicate-name skills don't run): a pre-existing gap this PR makes easier to reach; proposed as the lane's next PR.

@brennanb2025
brennanb2025 merged commit c196901 into main Oct 19, 2026
38 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant