daemon-backend-opencode · v0.4.0 · 2026-08-07 · sha256 5a87b4b238fdc7be

daemon-backend-opencode v0.4.0B

Immutable. This exact content is served forever at /api/v1/blob/5a87b4b238fdc7be.

---
name: daemon-backend-opencode
description: >
  Nested daemon-cli-backends reference for the OpenCode daemon backend's flag
  surface and operational setup (install, auth, run flags, warm server,
  custom agents). Read this when a daemon task needs OpenCode-specific CLI
  flags (model selection, provider-specific reasoning variants, agent choice)
  or OpenCode install/auth preparation: it routes you to the installed CLI's
  live help via shell and shows how to translate that help into the generic
  `backend_options` mechanism. It is not a flag catalog.
version: 0.4.0
last_changed_at: 2026-08-07T00:00:00Z
related_files:
- src/lingtai/tools/daemon/manual/reference/cli-backends/SKILL.md
maintenance: |
  Tracks the OpenCode daemon backend flag-discovery and operational-core topics it documents; update when that integration changes.
---

# OpenCode Daemon Backend — Flag Discovery Entrypoint

The installed CLI's own help is the authority for OpenCode flags; this page is
only the entrypoint. Conversion rules, key safety, and persistence live in the
parent [`reference/cli-backends/SKILL.md`](../../../SKILL.md). This page also
owns the OpenCode operational core (install, auth, run flags, warm server,
custom agents) migrated from the retired `shell-manual` bash reference.

## Install & verify

```bash
# Official install script
curl -fsSL https://opencode.ai/install | bash

# Or install with a Node.js package manager
npm install -g opencode-ai      # also works with bun/pnpm/yarn

# Confirm it is on PATH
opencode --version
```

## Discover flags from the installed CLI

1. Run, in bash: `opencode --version`, `opencode --help`, and
   `opencode run --help`. The daemon backend wraps `opencode run`, so
   `opencode run --help` is the relevant flag surface. These are local
   read-only commands; no session is started.
2. Translate what you found into `backend_options` with the parent's generic
   conversion rules. Nothing OpenCode-specific is added to that contract here.

## Example: model and reasoning variant

OpenCode selects models as `provider/model` via `-m, --model`, and exposes
provider-specific reasoning effort as `--variant` (see `opencode run --help`
for both). Through `backend_options`, plain scalars become `--flag <value>`:

```jsonc
{
  "backend": "opencode",
  "tasks": [{
    "task": "Implement and validate the change.",
    "tools": [],
    "backend_options": {
      "model": "anthropic/claude-sonnet-4-5",
      "variant": "high"
    }
  }]
}
// argv: --model anthropic/claude-sonnet-4-5 --variant high
```

The model and variant vocabularies belong to the installed CLI and the selected
provider — LingTai does not validate, enumerate, or simulate them.

## Condensed `opencode run` flag surface

Illustrative, not a catalog — verify every flag against `opencode run --help`
on the installed CLI before relying on it in automation; OpenCode moves
quickly. Through `backend_options`, plain scalars become `--flag <value>`.

| Flag | Purpose |
|------|---------|
| `--dir DIR` | Run in a directory (or remote path when using `--attach`) |
| `--model PROVIDER/MODEL` / `-m` | Choose model, e.g. `openai/gpt-5.5`, `anthropic/claude-sonnet-4-5` |
| `--variant VALUE` | Provider-specific reasoning effort / model variant |
| `--agent NAME` | Use a named OpenCode agent |
| `--file PATH` / `-f` | Attach file(s) to the message |
| `--format json` | Raw JSON events for scripts — harness-owned for daemon runs (see Harness boundary) |
| `--continue` / `-c` | Continue the last session — harness-owned for daemon runs |
| `--session ID` / `-s` | Continue a specific session — harness-owned for daemon runs |
| `--fork` | Fork when continuing a session — harness-owned for daemon runs |
| `--attach URL` | Attach the run to an existing `opencode serve` backend |
| `--password PASSWORD` | Password for attaching to a warm `opencode serve` backend (see Warm server below) |
| `--dangerously-skip-permissions` | Auto-approve permissions not explicitly denied. Dangerous; only use in an externally sandboxed worktree. |

## Subscription & auth

Authenticate at least one provider before relying on OpenCode for work:

```bash
opencode auth login          # interactive provider selection
opencode auth login -p openai
opencode auth list           # or: opencode auth ls
```

OpenCode stores provider credentials in `~/.local/share/opencode/auth.json`
and also loads provider keys from the environment and from a project `.env`
file. For the curated **OpenCode Go** subscription use the `opencode-go`
preset with `OPENCODE_GO_API_KEY` and `https://opencode.ai/zen/go/v1` (chat
wire only).

Official docs: https://opencode.ai/docs/

## Warm server for repeated calls

Starting a fresh OpenCode run can cold-boot MCP servers. For many short calls,
keep a server warm:

```bash
# Session 1: save a generated password where another shell can read it
pwfile=/tmp/opencode-server-password
openssl rand -hex 16 > "$pwfile"
chmod 600 "$pwfile"
OPENCODE_SERVER_PASSWORD="$(cat "$pwfile")" opencode serve --port 4096

# Session 2: read the same password and attach
opencode run --attach http://localhost:4096 \
  --password "$(cat /tmp/opencode-server-password)" \
  --dir /path/to/repo \
  "Explain async/await in this codebase"
```

## Custom agent with constrained permissions

Deny-by-default: `opencode agent create` denies any omitted permission in the
generated agent frontmatter.

```bash
mkdir -p .opencode/agent
opencode agent create \
  --path .opencode/agent/reviewer.md \
  --description "Read-only reviewer for docs and code diffs" \
  --mode primary \
  --permissions read,grep,glob

opencode run --agent reviewer "Review this diff; do not edit files."
```

Available permissions include `bash`, `read`, `edit`, `glob`, `grep`,
`webfetch`, `task`, `todowrite`, `websearch`, `lsp`, and `skill`.

## Harness boundary

OpenCode reserves `--format` at the validation layer: the daemon owns
`opencode run --format json` so its per-line JSON event parsing keeps working,
and passing `--format` in `backend_options` refuses the whole batch before
spawn. Beyond that, do not re-set harness-owned surfaces: session flags
(`--session` / `--continue`) belong to `daemon(action="ask", input={"id": ..., "message": ...})` resume
(`opencode run --session <opencode_session_id> --format json ...`), and the
completion MCP is injected through the `OPENCODE_CONFIG_CONTENT` environment
variable — not argv — so breaking either silently breaks progress/result
extraction and completion enforcement.

In `daemon.json`, OpenCode's `backend_harness_argv` holds a sentinel token pair
that the runner converts into the `OPENCODE_CONFIG_CONTENT` environment variable
rather than real argv flags.

## Key Commands

| Command | Purpose |
|---------|---------|
| `opencode run [message...]` | Run non-interactively and exit |
| `opencode serve` | Start a headless HTTP server for API/attached runs |
| `opencode attach [url]` | Attach a terminal to an existing backend server |
| `opencode auth login/list/logout` | Manage provider credentials |
| `opencode agent create/list` | Manage custom OpenCode agents |
| `opencode mcp add/list/auth/logout/debug` | Manage MCP servers |
| `opencode models` / `opencode models --refresh` | List or refresh provider/model cache |

## Best Practices

1. **Use a clean worktree.** OpenCode can edit files. Isolate risky runs in
   `/tmp/...` worktrees so you can inspect or discard changes safely.
2. **Set `--dir` explicitly.** Avoid running against the wrong repository when
   the bash working directory is ambiguous.

## Troubleshooting

| Issue | Fix |
|-------|-----|
| `opencode: command not found` | Install with `npm install -g opencode-ai`, then confirm `$(npm prefix -g)/bin` is on PATH (or use your package manager's global-bin command). |
| No provider/model available | Run `opencode auth login`, check environment variables / project `.env`, then `opencode models --refresh`. |
| Wrong repository edited | Stop, inspect `git diff`, and rerun with explicit `--dir /path/to/repo` in a disposable worktree. |
| Permission prompts hang automation | Prefer a custom agent with explicit permissions; if externally sandboxed, use `--dangerously-skip-permissions`. |
| Slow repeated calls | Use `opencode serve` and `opencode run --attach http://localhost:4096 ...`. |
| Session continuation hits the wrong thread | Use `--session <id>` instead of `--continue`; add `--fork` for experiments. |