
Opencode Bridge
Wire the OpenWork UI to an OpenCode runtime using CLI calls, SQLite session reads, and MCP streaming when you are building an agent desktop or IDE companion.
Overview
opencode-bridge is an agent skill for the Build phase that documents how OpenWork connects to OpenCode via CLI, SQLite, and MCP.
Install
npx skills add https://github.com/different-ai/openwork --skill opencode-bridgeWhat is this skill?
- Documents three bridge paths: CLI invocation, SQLite database access, and MCP for real-time streaming and permissions
- CLI recipe: `opencode -p` with `-f json`, `-q`, `-c`, and `-d` for non-interactive JSON responses
- Maps OpenCode DB locations (`~/.opencode/opencode.db` or project-local `.opencode/opencode.db`) and key `sessions` / `me
- Explains when to use batch CLI vs DB reads vs MCP bridge for OpenWork ↔ OpenCode communication
- Documents 3 communication mechanisms: CLI invocation, database access, and MCP bridge
- CLI reference covers 5 flags: -p, -f, -q, -c, -d
Adoption & trust: 630 installs on skills.sh; 15.9k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You are building OpenWork against OpenCode but lack a single reference for CLI flags, database schema, and when to use the MCP bridge instead of one-off commands.
Who is it for?
Solo builders coding OpenWork or a fork who need authoritative bridge mechanics (CLI, DB, MCP) in one place for their coding agent.
Skip if: Teams that only run stock OpenCode in a terminal with no OpenWork UI, or anyone who wants a journey-wide planning methodology rather than integration reference material.
When should I use this skill?
You are implementing or debugging OpenWork’s connection to OpenCode and need CLI, database, or MCP bridge details.
What do I get? / Deliverables
Your agent implements a consistent OpenWork ↔ OpenCode bridge with correct CLI invocation, DB reads, and MCP streaming paths aligned to the documented schema and flags.
- Bridge implementation aligned to documented CLI flags and JSON response shape
- Queries or accessors against documented `sessions` and `messages` tables
- MCP bridge configuration for streaming and permission handoff between UI and runtime
Recommended Skills
Journey fit
Connecting OpenWork to OpenCode is an implementation-time integration task: you add the bridge while building agent tooling, not while validating an idea or operating production monitors. The skill documents CLI flags, database paths, and MCP wiring—classic third-party and runtime integration work under build → integrations.
How it compares
Use as integration reference for OpenWork + OpenCode, not as a generic MCP server catalog entry or ad-hoc chat guesses about DB paths.
Common Questions / FAQ
Who is opencode-bridge for?
Indie and solo developers building or extending OpenWork who need their agent to wire the UI to OpenCode’s CLI, SQLite data, and MCP bridge correctly.
When should I use opencode-bridge?
During the build phase when you implement OpenWork integrations—spawning `opencode -p` with JSON output, reading session/message tables, or adding MCP streaming and permissions between UI and runtime.
Is opencode-bridge safe to install?
Treat it as documentation for systems that invoke shell, read local databases, and use MCP; review the Security Audits panel on this Prism page before trusting it in production workflows.
SKILL.md
READMESKILL.md - Opencode Bridge
## Overview OpenWork communicates with OpenCode via three mechanisms: 1. **CLI invocation**: Spawn `opencode` with prompts and get JSON responses. 2. **Database access**: Read OpenCode's SQLite database for sessions and messages. 3. **MCP bridge**: Real-time bidirectional communication for streaming and permissions. ## CLI Invocation ### Non-interactive mode ```bash opencode -p "your prompt" -f json -q ``` Returns JSON with the response content. ### Flags | Flag | Description | |------|-------------| | `-p` | Prompt to execute | | `-f` | Output format (`text`, `json`) | | `-q` | Quiet mode (no spinner) | | `-c` | Working directory | | `-d` | Debug mode | ### Example response ```json { "content": "Here is the result...", "session_id": "abc123" } ``` ## Database Access ### Location ``` ~/.opencode/opencode.db ``` Or project-local: ``` .opencode/opencode.db ``` ### Schema (key tables) #### sessions ```sql CREATE TABLE sessions ( id TEXT PRIMARY KEY, parent_session_id TEXT, title TEXT, message_count INTEGER, prompt_tokens INTEGER, completion_tokens INTEGER, summary_message_id TEXT, cost REAL, created_at INTEGER, updated_at INTEGER ); ``` #### messages ```sql CREATE TABLE messages ( id TEXT PRIMARY KEY, session_id TEXT, role TEXT, -- 'user', 'assistant', 'tool' parts TEXT, -- JSON array of content parts model TEXT, created_at INTEGER, updated_at INTEGER ); ``` ### Querying from Rust (Tauri) ```rust use tauri_plugin_sql::{Migration, MigrationKind}; #[tauri::command] async fn list_sessions(db: tauri::State<'_, Database>) -> Result<Vec<Session>, String> { let sessions = sqlx::query_as::<_, Session>( "SELECT * FROM sessions ORDER BY updated_at DESC" ) .fetch_all(&db.pool) .await .map_err(|e| e.to_string())?; Ok(sessions) } ``` ### Querying from SolidJS ```tsx import Database from "@tauri-apps/plugin-sql"; const db = await Database.load("sqlite:~/.opencode/opencode.db"); const sessions = await db.select<Session[]>( "SELECT * FROM sessions ORDER BY updated_at DESC" ); ``` ## MCP Bridge (Advanced) OpenWork can register as an MCP server that OpenCode connects to. ### Configuration (opencode.json) ```json { "mcpServers": { "openwork": { "type": "stdio", "command": "openwork-mcp-bridge" } } } ``` ### Use cases - Real-time permission prompts surfaced in OpenWork UI. - Streaming progress updates. - Custom tools exposed from OpenWork (e.g., native file picker). ## Message Content Parts Messages contain a `parts` JSON array with different content types: ### TextContent ```json { "type": "text", "text": "Hello world" } ``` ### ToolCall ```json { "type": "tool_call", "id": "call_123", "name": "bash", "input": "{\"command\": \"ls\"}" } ``` ### ToolResult ```json { "type": "tool_result", "tool_call_id": "call_123", "content": "file1.txt\nfile2.txt", "is_error": false } ``` ### Finish ```json { "type": "finish", "reason": "end_turn", "time": 1704067200 } ``` ## Common Gotchas - Database is SQLite; use read-only access to avoid conflicts with running OpenCode. - Message parts are JSON-encoded strings; parse them in the UI. - Session IDs are UUIDs; tool call IDs are also UUIDs. - Cost is in USD; tokens are raw counts. ## First-Time Setup ### Verify OpenCode is installed ```bash which opencode opencode --version ``` ### Verify database exists ```bash ls ~/.opencode/opencode.db ``` ### Test CLI invocation ```bash opencode -p "Hello" -f json -q ```