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 /
bypassPermissionsmode) - 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.
- 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 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-crushVerify 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())"omni run --harness crush
omni run --harness crush -p "review the last commit"Or in agent YAML:
executor:
harness: crushBinary resolution follows the shared precedence: OMNIGENT_CRUSH_PATH env
var, then harness.crush.command in ~/.omnigent/config.yaml, then PATH.
- Wire protocol reference:
internal/server/proto.goandinternal/clientin 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.pyruns without crush installed (pure translation checks over recorded envelope shapes);tests/test_live_*.pyneed 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.