{ "id": "opencode", "role": "runtime", "version": "1.13.0", "title": "OpenCode", "description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.", "tier": "core", "requires": [], "engines": { "gsd": ">=1.6.0" }, "runtime": { "configHome": { "kind": "xdg", "name": "opencode", "env": [ "OPENCODE_CONFIG_DIR", "OPENCODE_CONFIG", "XDG_CONFIG_HOME" ] }, "localConfigDir": ".opencode", "configFormat": "settings-json", "artifactLayout": { "global": [ { "kind": "commands", "destSubpath": "commands", "prefix": "gsd-", "nesting": "flat", "recursive": false, "converter": null }, { "kind": "skills", "destSubpath": "skills", "prefix": "gsd-", "nesting": "flat", "recursive": true, "converter": "convertClaudeCommandToOpencodeSkill" }, { "kind": "agents", "destSubpath": "agents", "prefix": "gsd-", "nesting": "flat", "recursive": false, "converter": "convertClaudeToOpencodeFrontmatter" } ], "local": [ { "kind": "commands", "destSubpath": "commands", "prefix": "gsd-", "nesting": "flat", "recursive": false, "converter": null }, { "kind": "skills", "destSubpath": "skills", "prefix": "gsd-", "nesting": "flat", "recursive": true, "converter": "convertClaudeCommandToOpencodeSkill" }, { "kind": "agents", "destSubpath": "agents", "prefix": "gsd-", "nesting": "flat", "recursive": false, "converter": "convertClaudeToOpencodeFrontmatter" } ] }, "triggerPrecedence": [ "skills", "commands" ], "commandStyle": "slash-hyphen", "hooksSurface": "none", "extensionEvents": "opencode", "sandboxTier": "none", "supportTier": 2, "installSurface": "settings-json", "writesSharedSettings": true, "permissionWriter": "opencode", "extendedHookEvents": [], "hostIntegration": { "embeddingMode": "imperative", "commandSurface": "slash-file", "dispatch": { "namedDispatch": true, "nested": "undocumented", "maxDepth": "undocumented", "background": false, "subagentToolkit": "full", "backgroundDispatch": false, "isolation": "orchestrator-worktree", "maxConcurrency": "undocumented" }, "modelMode": "active", "hookBus": "host", "stateIO": "filesystem", "transport": "mcp", "runtime": "bun", "effortSurface": "argv" }, "orchestratorExec": { "command": "opencode", "args": [ "run" ], "cwdFlag": "--dir", "promptFlag": null }, "hostBehaviors": { "reapplyCommand": "/gsd-update --reapply", "attributionConfigResolver": "opencode", "flatCommandDir": "commands", "combinedFamilyInstall": true, "frontmatterDialect": "opencode", "nativePlugin": { "dir": "plugins", "file": "gsd-core.js", "source": ".opencode/plugins/gsd-core.js" }, "skipHomePrefixSubstitution": true, "skipSettingsUi": true, "skipUpdateBannerCommand": true, "skipCodexSkillsManifest": true } }, "reviewer": { "slug": "opencode", "flags": [ "--opencode" ], "transport": "spawn", "probe": { "kind": "command-exists", "binary": "opencode" }, "invoke": { "binary": "opencode", "args": [ "run", "{{model}}", "{{effort}}", "--format", "json", "-" ], "promptChannel": "stdin", "outputChannel": "stdout", "modelArg": "--model", "effortChannel": "argv" }, "timeoutFloorMs": 660000, "timeoutConfigKey": "review.timeouts.opencode", "emptyOutput": "stub-with-stderr", "reviewsSection": "OpenCode", "evidenceClass": "source-grounded", "requiresBinaries": [], "promptBudgetKey": "review.max_prompt_tokens_per_reviewer.opencode", "modelConfigKey": "review.models.opencode", "effortConfigKey": "review.effort.opencode", "defaultEffort": "high", "handler": "opencode" }, "config": { "review.models.opencode": { "type": "string", "default": "", "description": "Model passed to the OpenCode reviewer lane." }, "review.max_prompt_tokens_per_reviewer.opencode": { "type": "number", "default": -1, "description": "Prompt-token budget for the OpenCode reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"." }, "review.timeouts.opencode": { "type": "number", "default": -1, "description": "Outer wall-clock timeout override (seconds) for the OpenCode reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset." }, "review.effort.opencode": { "type": "string", "default": "", "description": "Reasoning effort for the OpenCode reviewer lane: minimal, low, medium, high, xhigh, max, or inherit. Unset falls back to the lane's declared review default (high); inherit emits no effort argument so the CLI's own configuration decides. An unrecognized value falls back to the lane default rather than being forwarded." } } }