opencode-acp-control-2Control OpenCode directly via the Agent Client Protocol (ACP). Start sessions, send prompts, resume conversations, and manage OpenCode updates.
Install via ClawdBot CLI:
clawdbot install studio-hakke/opencode-acp-control-2Control OpenCode directly via the Agent Client Protocol (ACP).
| Action | How |
|--------|-----|
| Start OpenCode | bash(command: "opencode acp --cwd /path/to/project", background: true) |
| Send message | process.write(sessionId, data: " |
| Read response | process.poll(sessionId) - repeat every 2 seconds |
| Stop OpenCode | process.kill(sessionId) |
| List sessions | bash(command: "opencode session list", workdir: "...") |
| Resume session | List sessions → ask user → session/load |
| Check version | bash(command: "opencode --version") |
bash(
command: "opencode acp --cwd /path/to/your/project",
background: true,
workdir: "/path/to/your/project"
)
Save the returned sessionId - you'll need it for all subsequent commands.
\n)Send immediately after starting OpenCode:
{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":1,"clientCapabilities":{"fs":{"readTextFile":true,"writeTextFile":true},"terminal":true},"clientInfo":{"name":"clawdbot","title":"Clawdbot","version":"1.0.0"}}}
Poll for response. Expect result.protocolVersion: 1.
{"jsonrpc":"2.0","id":1,"method":"session/new","params":{"cwd":"/path/to/project","mcpServers":[]}}
Poll for response. Save result.sessionId (e.g., "sess_abc123").
{"jsonrpc":"2.0","id":2,"method":"session/prompt","params":{"sessionId":"sess_abc123","prompt":[{"type":"text","text":"Your question here"}]}}
Poll every 2 seconds. You'll receive:
session/update notifications (streaming content)result.stopReasonEach poll may return multiple lines. Parse each line as JSON:
method: "session/update" - collect these for the responseid matching your request - stop polling when stopReason appears{"jsonrpc":"2.0","method":"session/cancel","params":{"sessionId":"sess_abc123"}}
No response expected - this is a notification.
Per OpenCode instance, track:
processSessionId - from bash tool (clawdbot's process ID)opencodeSessionId - from session/new response (OpenCode's session ID) messageId - increment for each request you sendstopReason| stopReason | Meaning |
|------------|---------|
| end_turn | Agent finished responding |
| cancelled | You cancelled the prompt |
| max_tokens | Token limit reached |
| Issue | Solution |
|-------|----------|
| Empty poll response | Keep polling - agent is thinking |
| Parse error | Skip malformed line, continue |
| Process exited | Restart OpenCode |
| No response after 5min | Kill process, start fresh |
1. bash(command: "opencode acp --cwd /home/user/myproject", background: true, workdir: "/home/user/myproject")
-> processSessionId: "bg_42"
2. process.write(sessionId: "bg_42", data: '{"jsonrpc":"2.0","id":0,"method":"initialize",...}\n')
process.poll(sessionId: "bg_42") -> initialize response
3. process.write(sessionId: "bg_42", data: '{"jsonrpc":"2.0","id":1,"method":"session/new","params":{"cwd":"/home/user/myproject","mcpServers":[]}}\n')
process.poll(sessionId: "bg_42") -> opencodeSessionId: "sess_xyz789"
4. process.write(sessionId: "bg_42", data: '{"jsonrpc":"2.0","id":2,"method":"session/prompt","params":{"sessionId":"sess_xyz789","prompt":[{"type":"text","text":"List all TypeScript files"}]}}\n')
5. process.poll(sessionId: "bg_42") every 2 sec until stopReason
-> Collect all session/update content
-> Final response: stopReason: "end_turn"
6. When done: process.kill(sessionId: "bg_42")
Resume a previous OpenCode session by letting the user choose from available sessions.
bash(command: "opencode session list", workdir: "/path/to/project")
Example output:
ID Updated Messages
ses_451cd8ae0ffegNQsh59nuM3VVy 2026-01-11 15:30 12
ses_451a89e63ffea2TQIpnDGtJBkS 2026-01-10 09:15 5
ses_4518e90d0ffeJIpOFI3t3Jd23Q 2026-01-09 14:22 8
Present the list to the user and ask which session to resume:
"Which session would you like to resume?
1. ses_451cd8ae... (12 messages, updated 2026-01-11)
2. ses_451a89e6... (5 messages, updated 2026-01-10)
3. ses_4518e90d... (8 messages, updated 2026-01-09)
Enter session number or ID:"
Once user responds (e.g., "1", "the first one", or "ses_451cd8ae..."):
bash(command: "opencode acp --cwd /path/to/project", background: true, workdir: "/path/to/project")
{"jsonrpc":"2.0","id":0,"method":"initialize","params":{...}}
{"jsonrpc":"2.0","id":1,"method":"session/load","params":{"sessionId":"ses_451cd8ae0ffegNQsh59nuM3VVy","cwd":"/path/to/project","mcpServers":[]}}
Note: session/load requires cwd and mcpServers parameters.
On load, OpenCode streams the full conversation history back to you.
function resumeSession(workdir):
# List available sessions
output = bash("opencode session list", workdir: workdir)
sessions = parseSessionList(output)
if sessions.empty:
notify("No previous sessions found. Starting fresh.")
return createNewSession(workdir)
# Ask user to choose
choice = askUser("Which session to resume?", sessions)
selectedId = matchUserChoice(choice, sessions)
# Start OpenCode and load session
process = bash("opencode acp --cwd " + workdir, background: true, workdir: workdir)
initialize(process)
session_load(process, selectedId, workdir, mcpServers: [])
notify("Session resumed. Conversation history loaded.")
return process
OpenCode auto-updates when restarted. Use this workflow to check and trigger updates.
bash(command: "opencode --version")
Returns something like: opencode version 1.1.13
Extract the version number (e.g., 1.1.13).
webfetch(url: "https://github.com/anomalyco/opencode/releases/latest", format: "text")
The redirect URL contains the latest version tag:
https://github.com/anomalyco/opencode/releases/tag/v1.2.01.2.0)If latest version > current version:
process.list() # Find all "opencode acp" processes
process.kill(sessionId) # For each running instance
bash(command: "opencode acp --cwd /path/to/project", background: true, workdir: "/path/to/project")
bash(command: "opencode --version")
If version still doesn't match latest:
curl -fsSL https://opencode.dev/install | bashfunction updateOpenCode():
current = bash("opencode --version") # e.g., "1.1.13"
latestPage = webfetch("https://github.com/anomalyco/opencode/releases/latest")
latest = extractVersionFromRedirectUrl(latestPage) # e.g., "1.2.0"
if semverCompare(latest, current) > 0:
# Stop all instances
for process in process.list():
if process.command.includes("opencode"):
process.kill(process.sessionId)
# Wait briefly for processes to terminate
sleep(2 seconds)
# Restart triggers auto-update
bash("opencode acp", background: true)
# Verify
newVersion = bash("opencode --version")
if newVersion != latest:
notify("Auto-update may have failed. Manual update recommended.")
else:
notify("OpenCode is up to date: " + current)
opencodeSessionId survives restarts — use session/load to recoverGenerated Mar 1, 2026
Development teams use OpenCode ACP to automate code reviews, generate documentation, and refactor legacy codebases. The skill enables continuous interaction with the codebase through session management, allowing developers to maintain context across multiple work sessions without restarting analysis.
IT support teams leverage OpenCode to diagnose issues in customer codebases by starting ACP sessions, sending diagnostic prompts, and analyzing responses. The polling mechanism allows real-time monitoring of OpenCode's analysis while handling multiple concurrent support tickets through session isolation.
Coding bootcamps and online learning platforms integrate OpenCode to provide automated feedback on student assignments. Instructors can resume previous review sessions, track student progress through message history, and use the structured JSON-RPC protocol to maintain consistent evaluation standards across multiple courses.
Enterprises undergoing digital transformation use OpenCode ACP to systematically analyze legacy systems and generate migration plans. The skill's session management capabilities allow teams to pause and resume complex code analysis across large codebases, while the background process execution ensures continuous operation during long-running migrations.
Quality assurance teams integrate OpenCode into their CI/CD pipelines to automatically generate test cases, identify edge cases, and validate code changes. The skill's error handling and timeout management ensure reliable operation in automated environments, while session tracking maintains context across different testing phases.
Companies integrate OpenCode ACP as a white-labeled code analysis service within their existing developer platforms. Revenue comes from subscription tiers based on session volume, with enterprise plans offering advanced session management and priority support for high-volume usage.
Specialized consulting firms build custom workflows around OpenCode ACP for enterprise clients, offering implementation, training, and ongoing support. Revenue streams include project-based fees for initial setup and retainer contracts for continuous optimization of the ACP integration within client development processes.
Platforms that aggregate developer tools offer OpenCode ACP as a premium skill within their marketplace, taking a percentage of transactions. Revenue is generated through marketplace commissions, with additional income from featured placements and bundled offerings with complementary development tools.
💬 Integration Tip
Implement robust error handling for the polling mechanism and maintain proper session state tracking to prevent data loss during long-running operations with OpenCode.
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
Provides a 7-step debugging protocol plus language-specific commands to systematically identify, verify, and fix software bugs across multiple environments.
A comprehensive skill for using the Cursor CLI agent for various software engineering tasks (updated for 2026 features, includes tmux automation guide).
Write, run, and manage unit, integration, and E2E tests across TypeScript, Python, and Swift using recommended frameworks.
Control and operate Opencode via slash commands. Use this skill to manage sessions, select models, switch agents (plan/build), and coordinate coding through Opencode.
Coding style memory that adapts to your preferences, conventions, and patterns for consistent coding.