Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

omnigent-crush

Community harness plugin for Omnigent that adds Charm's Crush coding agent as a first-class crush harness id.

Not a native TUI mirror — Omnigent's plugin interface only supports headless harnesses today. Instead this harness spawns a dedicated crush server child per conversation, registers a workspace rooted at the session's working directory, and drives prompts over the server's HTTP/SSE API:

  • streaming text and reasoning deltas into the Omnigent transcript
  • tool calls and results rendered as informational tool cards (crush runs its own tool loop, including its LSP and MCP integrations)
  • crush permission prompts surfaced as Omnigent approval cards (or auto-approved in YOLO / bypassPermissions mode)
  • interrupt support (cancel maps to crush's session-cancel endpoint)
  • native crush session continuity — follow-up turns continue the same crush conversation

Crush owns its auth and model: log in and pick a model through the crush TUI first. A /model pick in Omnigent is not forwarded.

Known limitations

  • Question batches (crush's clarifying-question tool) are auto-dismissed; the agent proceeds without the answer. Restate your intent specifically.
  • Attachments/images in prompts are not forwarded.

Install

Install into the same environment omnigent runs from (its uv tool venv):

omni stop  # the server only picks up plugins at startup
uv pip install --python ~/.local/share/uv/tools/omnigent \
  git+https://github.com/gregorydickson/omnigent-crush.git

(omni stop matters: the long-lived local server loads harness plugins at startup, so a running server predating the install rejects crush as an unknown harness.)

For development, from a checkout:

uv pip install --python ~/.local/share/uv/tools/omnigent -e /path/to/omnigent-crush

Verify registration with the omnigent venv's interpreter:

~/.local/share/uv/tools/omnigent/bin/python -c \
  "from omnigent.harness_plugins import valid_harnesses; print('crush' in valid_harnesses())"

Use

omni run --harness crush
omni run --harness crush -p "review the last commit"

Or in agent YAML:

executor:
  harness: crush

Binary resolution follows the shared precedence: OMNIGENT_CRUSH_PATH env var, then harness.crush.command in ~/.omnigent/config.yaml, then PATH.

Development notes

  • Wire protocol reference: internal/server/proto.go and internal/client in charmbracelet/crush (developed against v0.91.2). The server protocol is internal and moves fast — crush ships roughly weekly; expect to re-verify the recorded envelopes when breakage appears.
  • The executor mirrors crush run's client/server flow, including RunID correlation for run-complete attribution and final-text reconciliation.
  • tests/test_offline_translation.py runs without crush installed (pure translation checks over recorded envelope shapes); tests/test_live_*.py need a working, authenticated crush CLI and network access.
  • If upstream ever ships ACP support (charmbracelet/crush#990), this plugin becomes unnecessary — prefer the 3-line acp: config there.

Releases

Packages

Contributors

Languages