风险评分

76/100 (Low)

OpenClaw: benign
VirusTotal: suspicious
StaticScan: unknown

Opencode Acp Control

作者: Bastian Berrios Alarcon
Slug:opencode-acp-control-2
版本:0.1.1
更新时间:2026-03-24 11:38:29
风险信息

OpenClaw: benign

查看 OpenClaw 分析摘要(前 200 字预览)
The skill's instructions match its stated purpose (controlling a local OpenCode instance via ACP), but there are a few minor inconsistencies you should be aware of before installing (notably undeclare...

[内容已截断]

VirusTotal: suspicious VT 报告

静态扫描: unknown

README

README 未提供

文件列表

无文件信息

下载
下载官方 ZIP
原始 JSON 数据
{
    "latestVersion": {
        "_creationTime": 1771530814706,
        "_id": "k978wsyve09t36kb1fxz2k93gx81edjz",
        "changelog": "OpenCode ACP Skill\nControl OpenCode directly via the Agent Client Protocol (ACP).\n\nMetadata\nFor ACP Protocol Docs (for Agents\/LLMs): https:\/\/agentclientprotocol.com\/llms.txt\nGitHub Repo: https:\/\/github.com\/bjesuiter\/opencode-acp-skill\nIf you have issues with this skill, please open an issue ticket here: https:\/\/github.com\/berriosb\/Opencode-Acp-Control\nQuick Reference\nAction\tHow\nStart OpenCode\tbash(command: \"opencode acp --cwd \/path\/to\/project\", background: true)\nSend message\tprocess.write(sessionId, data: \"\\n\")\nRead response\tprocess.poll(sessionId) - repeat every 2 seconds\nStop OpenCode\tprocess.kill(sessionId)\nList sessions\tbash(command: \"opencode session list\", workdir: \"...\")\nResume session\tList sessions → ask user → session\/load\nCheck version\tbash(command: \"opencode --version\")\nStarting OpenCode\nbash(\n  command: \"opencode acp --cwd \/path\/to\/your\/project\",\n  background: true,\n  workdir: \"\/path\/to\/your\/project\"\n)\nSave the returned sessionId - you'll need it for all subsequent commands.\n\nProtocol Basics\nAll messages are JSON-RPC 2.0 format\nMessages are newline-delimited (end each with \\n)\nMaintain a message ID counter starting at 0\nStep-by-Step Workflow\nStep 1: Initialize Connection\nSend immediately after starting OpenCode:\n\n{\"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\"}}}\nPoll for response. Expect result.protocolVersion: 1.\n\nStep 2: Create Session\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"session\/new\",\"params\":{\"cwd\":\"\/path\/to\/project\",\"mcpServers\":[]}}\nPoll for response. Save result.sessionId (e.g., \"sess_abc123\").\n\nStep 3: Send Prompts\n{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"session\/prompt\",\"params\":{\"sessionId\":\"sess_abc123\",\"prompt\":[{\"type\":\"text\",\"text\":\"Your question here\"}]}}\nPoll every 2 seconds. You'll receive:\n\nsession\/update notifications (streaming content)\nFinal response with result.stopReason\nStep 4: Read Responses\nEach poll may return multiple lines. Parse each line as JSON:\n\nNotifications: method: \"session\/update\" - collect these for the response\nResponse: Has id matching your request - stop polling when stopReason appears\nStep 5: Cancel (if needed)\n{\"jsonrpc\":\"2.0\",\"method\":\"session\/cancel\",\"params\":{\"sessionId\":\"sess_abc123\"}}\nNo response expected - this is a notification.\n\nState to Track\nPer OpenCode instance, track:\n\nprocessSessionId - from bash tool (clawdbot's process ID)\nopencodeSessionId - from session\/new response (OpenCode's session ID)\nmessageId - increment for each request you send\nPolling Strategy\nPoll every 2 seconds\nContinue until you receive a response with stopReason\nMax wait: 5 minutes (150 polls)\nIf no response, consider the operation timed out\nCommon Stop Reasons\nstopReason\tMeaning\nend_turn\tAgent finished responding\ncancelled\tYou cancelled the prompt\nmax_tokens\tToken limit reached\nError Handling\nIssue\tSolution\nEmpty poll response\tKeep polling - agent is thinking\nParse error\tSkip malformed line, continue\nProcess exited\tRestart OpenCode\nNo response after 5min\tKill process, start fresh\nExample: Complete Interaction\n1. bash(command: \"opencode acp --cwd \/home\/user\/myproject\", background: true, workdir: \"\/home\/user\/myproject\")\n   -> processSessionId: \"bg_42\"\n\n2. process.write(sessionId: \"bg_42\", data: '{\"jsonrpc\":\"2.0\",\"id\":0,\"method\":\"initialize\",...}\\n')\n   process.poll(sessionId: \"bg_42\") -> initialize response\n\n3. process.write(sessionId: \"bg_42\", data: '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"session\/new\",\"params\":{\"cwd\":\"\/home\/user\/myproject\",\"mcpServers\":[]}}\\n')\n   process.poll(sessionId: \"bg_42\") -> opencodeSessionId: \"sess_xyz789\"\n\n4. 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')\n   \n5. process.poll(sessionId: \"bg_42\") every 2 sec until stopReason\n   -> Collect all session\/update content\n   -> Final response: stopReason: \"end_turn\"\n\n6. When done: process.kill(sessionId: \"bg_42\")\nResume Session\nResume a previous OpenCode session by letting the user choose from available sessions.\n\nStep 1: List Available Sessions\nbash(command: \"opencode session list\", workdir: \"\/path\/to\/project\")\nExample output:\n\nID                                  Updated              Messages\nses_451cd8ae0ffegNQsh59nuM3VVy      2026-01-11 15:30     12\nses_451a89e63ffea2TQIpnDGtJBkS      2026-01-10 09:15     5\nses_4518e90d0ffeJIpOFI3t3Jd23Q      2026-01-09 14:22     8\nStep 2: Ask User to Choose\nPresent the list to the user and ask which session to resume:\n\n\"Which session would you like to resume?\n \n1. ses_451cd8ae... (12 messages, updated 2026-01-11)\n2. ses_451a89e6... (5 messages, updated 2026-01-10)\n3. ses_4518e90d... (8 messages, updated 2026-01-09)\n\nEnter session number or ID:\"\nStep 3: Load Selected Session\nOnce user responds (e.g., \"1\", \"the first one\", or \"ses_451cd8ae...\"):\n\nStart OpenCode ACP:\n\nbash(command: \"opencode acp --cwd \/path\/to\/project\", background: true, workdir: \"\/path\/to\/project\")\nInitialize:\n\n{\"jsonrpc\":\"2.0\",\"id\":0,\"method\":\"initialize\",\"params\":{...}}\nLoad the session:\n\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"session\/load\",\"params\":{\"sessionId\":\"ses_451cd8ae0ffegNQsh59nuM3VVy\",\"cwd\":\"\/path\/to\/project\",\"mcpServers\":[]}}\nNote: session\/load requires cwd and mcpServers parameters.\n\nOn load, OpenCode streams the full conversation history back to you.\n\nResume Workflow Summary\nfunction resumeSession(workdir):\n    # List available sessions\n    output = bash(\"opencode session list\", workdir: workdir)\n    sessions = parseSessionList(output)\n    \n    if sessions.empty:\n        notify(\"No previous sessions found. Starting fresh.\")\n        return createNewSession(workdir)\n    \n    # Ask user to choose\n    choice = askUser(\"Which session to resume?\", sessions)\n    selectedId = matchUserChoice(choice, sessions)\n    \n    # Start OpenCode and load session\n    process = bash(\"opencode acp --cwd \" + workdir, background: true, workdir: workdir)\n    initialize(process)\n    \n    session_load(process, selectedId, workdir, mcpServers: [])\n    \n    notify(\"Session resumed. Conversation history loaded.\")\n    return process\nImportant Notes\nHistory replay: On load, all previous messages stream back\nMemory preserved: Agent remembers the full conversation\nProcess independent: Sessions survive OpenCode restarts\nUpdating OpenCode\nOpenCode auto-updates when restarted. Use this workflow to check and trigger updates.\n\nStep 1: Check Current Version\nbash(command: \"opencode --version\")\nReturns something like: opencode version 1.1.13\n\nExtract the version number (e.g., 1.1.13).\n\nStep 2: Check Latest Version\nwebfetch(url: \"https:\/\/github.com\/anomalyco\/opencode\/releases\/latest\", format: \"text\")\nThe redirect URL contains the latest version tag:\n\nRedirects to: https:\/\/github.com\/anomalyco\/opencode\/releases\/tag\/v1.2.0\nExtract version from the URL path (e.g., 1.2.0)\nStep 3: Compare and Update\nIf latest version > current version:\n\nStop all running OpenCode processes:\n\nprocess.list()  # Find all \"opencode acp\" processes\nprocess.kill(sessionId) # For each running instance\nRestart instances (OpenCode auto-downloads new binary on start):\n\nbash(command: \"opencode acp --cwd \/path\/to\/project\", background: true, workdir: \"\/path\/to\/project\")\nRe-initialize each instance (initialize + session\/load for existing sessions)\n\nStep 4: Verify Update\nbash(command: \"opencode --version\")\nIf version still doesn't match latest:\n\nInform user: \"OpenCode auto-update may have failed. Current: X.X.X, Latest: Y.Y.Y\"\nSuggest manual update: curl -fsSL https:\/\/opencode.dev\/install | bash\nUpdate Workflow Summary\nfunction updateOpenCode():\n    current = bash(\"opencode --version\")  # e.g., \"1.1.13\"\n    \n    latestPage = webfetch(\"https:\/\/github.com\/anomalyco\/opencode\/releases\/latest\")\n    latest = extractVersionFromRedirectUrl(latestPage)  # e.g., \"1.2.0\"\n    \n    if semverCompare(latest, current) > 0:\n        # Stop all instances\n        for process in process.list():\n            if process.command.includes(\"opencode\"):\n                process.kill(process.sessionId)\n        \n        # Wait briefly for processes to terminate\n        sleep(2 seconds)\n        \n        # Restart triggers auto-update\n        bash(\"opencode acp\", background: true)\n        \n        # Verify\n        newVersion = bash(\"opencode --version\")\n        if newVersion != latest:\n            notify(\"Auto-update may have failed. Manual update recommended.\")\n    else:\n        notify(\"OpenCode is up to date: \" + current)\nImportant Notes\nSessions persist: opencodeSessionId survives restarts — use session\/load to recover\nAuto-update: OpenCode downloads new binary automatically on restart\nNo data loss: Conversation history is preserved server-side",
        "changelogSource": "user",
        "createdAt": 1771530814706,
        "version": "0.1.1"
    },
    "owner": {
        "_creationTime": 0,
        "_id": "publishers:missing",
        "displayName": "Bastian Berrios Alarcon",
        "handle": "studio-hakke",
        "image": "https:\/\/avatars.githubusercontent.com\/u\/253074697?v=4",
        "kind": "user",
        "linkedUserId": "kn74akfj24s29c981jn5zcej0580v987"
    },
    "ownerHandle": "studio-hakke",
    "skill": {
        "_creationTime": 1770640762925,
        "_id": "kd7dvqm6gm7826qx15sgbwjf7980vbqk",
        "badges": [],
        "createdAt": 1770640762925,
        "displayName": "Opencode Acp Control",
        "latestVersionId": "k978wsyve09t36kb1fxz2k93gx81edjz",
        "ownerUserId": "kn74akfj24s29c981jn5zcej0580v987",
        "slug": "opencode-acp-control-2",
        "stats": {
            "comments": 0,
            "downloads": 889,
            "installsAllTime": 4,
            "installsCurrent": 3,
            "stars": 5,
            "versions": 2
        },
        "summary": "Control OpenCode directly via the Agent Client Protocol (ACP). Start sessions, send prompts, resume conversations, and manage OpenCode updates.",
        "tags": {
            "latest": "k978wsyve09t36kb1fxz2k93gx81edjz"
        },
        "updatedAt": 1774323509536
    }
}