Hermes-agent opencode
Delegate coding tasks to OpenCode CLI agent for feature implementation, refactoring, PR review, and long-running autonomous sessions. Requires the opencode CLI installed and authenticated.
git clone https://github.com/NousResearch/hermes-agent
T=$(mktemp -d) && git clone --depth=1 https://github.com/NousResearch/hermes-agent "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/autonomous-ai-agents/opencode" ~/.claude/skills/nousresearch-hermes-agent-opencode-870f7b && rm -rf "$T"
skills/autonomous-ai-agents/opencode/SKILL.mdOpenCode CLI
Use OpenCode as an autonomous coding worker orchestrated by Hermes terminal/process tools. OpenCode is a provider-agnostic, open-source AI coding agent with a TUI and CLI.
When to Use
- User explicitly asks to use OpenCode
- You want an external coding agent to implement/refactor/review code
- You need long-running coding sessions with progress checks
- You want parallel task execution in isolated workdirs/worktrees
Prerequisites
- OpenCode installed:
ornpm i -g opencode-ai@latestbrew install anomalyco/tap/opencode - Auth configured:
or set provider env vars (OPENROUTER_API_KEY, etc.)opencode auth login - Verify:
should show at least one provideropencode auth list - Git repository for code tasks (recommended)
for interactive TUI sessionspty=true
Binary Resolution (Important)
Shell environments may resolve different OpenCode binaries. If behavior differs between your terminal and Hermes, check:
terminal(command="which -a opencode") terminal(command="opencode --version")
If needed, pin an explicit binary path:
terminal(command="$HOME/.opencode/bin/opencode run '...'", workdir="~/project", pty=true)
One-Shot Tasks
Use
opencode run for bounded, non-interactive tasks:
terminal(command="opencode run 'Add retry logic to API calls and update tests'", workdir="~/project")
Attach context files with
-f:
terminal(command="opencode run 'Review this config for security issues' -f config.yaml -f .env.example", workdir="~/project")
Show model thinking with
--thinking:
terminal(command="opencode run 'Debug why tests fail in CI' --thinking", workdir="~/project")
Force a specific model:
terminal(command="opencode run 'Refactor auth module' --model openrouter/anthropic/claude-sonnet-4", workdir="~/project")
Interactive Sessions (Background)
For iterative work requiring multiple exchanges, start the TUI in background:
terminal(command="opencode", workdir="~/project", background=true, pty=true) # Returns session_id # Send a prompt process(action="submit", session_id="<id>", data="Implement OAuth refresh flow and add tests") # Monitor progress process(action="poll", session_id="<id>") process(action="log", session_id="<id>") # Send follow-up input process(action="submit", session_id="<id>", data="Now add error handling for token expiry") # Exit cleanly — Ctrl+C process(action="write", session_id="<id>", data="\x03") # Or just kill the process process(action="kill", session_id="<id>")
Important: Do NOT use
/exit — it is not a valid OpenCode command and will open an agent selector dialog instead. Use Ctrl+C (\x03) or process(action="kill") to exit.
TUI Keybindings
| Key | Action |
|---|---|
| Submit message (press twice if needed) |
| Switch between agents (build/plan) |
| Open command palette |
| Switch session |
| Switch model |
| New session |
| Open editor |
| Exit OpenCode |
Resuming Sessions
After exiting, OpenCode prints a session ID. Resume with:
terminal(command="opencode -c", workdir="~/project", background=true, pty=true) # Continue last session terminal(command="opencode -s ses_abc123", workdir="~/project", background=true, pty=true) # Specific session
Common Flags
| Flag | Use |
|---|---|
| One-shot execution and exit |
/ | Continue the last OpenCode session |
/ | Continue a specific session |
| Choose OpenCode agent (build or plan) |
| Force specific model |
| Machine-readable output/events |
/ | Attach file(s) to the message |
| Show model thinking blocks |
| Reasoning effort (high, max, minimal) |
| Name the session |
| Connect to a running opencode server |
Procedure
- Verify tool readiness:
terminal(command="opencode --version")terminal(command="opencode auth list")
- For bounded tasks, use
(no pty needed).opencode run '...' - For iterative tasks, start
withopencode
.background=true, pty=true - Monitor long tasks with
.process(action="poll"|"log") - If OpenCode asks for input, respond via
.process(action="submit", ...) - Exit with
orprocess(action="write", data="\x03")
.process(action="kill") - Summarize file changes, test results, and next steps back to user.
PR Review Workflow
OpenCode has a built-in PR command:
terminal(command="opencode pr 42", workdir="~/project", pty=true)
Or review in a temporary clone for isolation:
terminal(command="REVIEW=$(mktemp -d) && git clone https://github.com/user/repo.git $REVIEW && cd $REVIEW && opencode run 'Review this PR vs main. Report bugs, security risks, test gaps, and style issues.' -f $(git diff origin/main --name-only | head -20 | tr '\n' ' ')", pty=true)
Parallel Work Pattern
Use separate workdirs/worktrees to avoid collisions:
terminal(command="opencode run 'Fix issue #101 and commit'", workdir="/tmp/issue-101", background=true, pty=true) terminal(command="opencode run 'Add parser regression tests and commit'", workdir="/tmp/issue-102", background=true, pty=true) process(action="list")
Session & Cost Management
List past sessions:
terminal(command="opencode session list")
Check token usage and costs:
terminal(command="opencode stats") terminal(command="opencode stats --days 7 --models anthropic/claude-sonnet-4")
Pitfalls
- Interactive
(TUI) sessions requireopencode
. Thepty=true
command does NOT need pty.opencode run
is NOT a valid command — it opens an agent selector. Use Ctrl+C to exit the TUI./exit- PATH mismatch can select the wrong OpenCode binary/model config.
- If OpenCode appears stuck, inspect logs before killing:
process(action="log", session_id="<id>")
- Avoid sharing one working directory across parallel OpenCode sessions.
- Enter may need to be pressed twice to submit in the TUI (once to finalize text, once to send).
Verification
Smoke test:
terminal(command="opencode run 'Respond with exactly: OPENCODE_SMOKE_OK'")
Success criteria:
- Output includes
OPENCODE_SMOKE_OK - Command exits without provider/model errors
- For code tasks: expected files changed and tests pass
Rules
- Prefer
for one-shot automation — it's simpler and doesn't need pty.opencode run - Use interactive background mode only when iteration is needed.
- Always scope OpenCode sessions to a single repo/workdir.
- For long tasks, provide progress updates from
logs.process - Report concrete outcomes (files changed, tests, remaining risks).
- Exit interactive sessions with Ctrl+C or kill, never
./exit