opencode-interceptor
v0.1.5
Published
Readme
opencode-interceptor
A lightweight OpenCode plugin that bridges the gap between Claude Code-native GSD workflow features and OpenCode.
Features
@ File Resolution
Resolves @path/to/file.md references inside skill files, replacing them with <resolved> XML blocks containing the file content. Works with:
- Relative paths (
@./refs/notes.md,@references/notes.md) - Absolute paths (
@/home/user/docs/notes.md,@C:/Users/...) - Recursive resolution (up to 5 levels deep)
- Circular reference detection
- Code block awareness (refs inside ``` fences are skipped)
- Cross-platform path support (Windows backslash and forward slash)
@! Script Execution
Executes @!path/to/script.sh references and inlines the script's stdout as a <resolved path="..." type="exec"> block. Useful for dynamically generating content from command output.
Hook Bridge
Executes Claude Code-compatible hook scripts from ~/.claude/settings.json:
- PreToolUse -- runs before a tool executes; exit code 2 blocks the tool
- PostToolUse -- runs after a tool executes; informational, cannot block
- Stop -- runs on session idle (fire-and-forget in OpenCode)
Hook scripts receive JSON on stdin with session_id, cwd, hook_event_name, tool_name, and tool_input.
Config Loading
Reads opencode.json for hook configuration:
gsd-bridge-hooks-enabled(flat key, preferred)gsd.hooks(nested key, fallback)
Skill Pre-resolution
On session start, pre-resolves all skill files so @ references are resolved before any skill tool call.
Installation
npm
// opencode.json
{
"plugin: ["opencode-interceptor"]
}Local
Copy plugins/gsd-bridge.ts and plugins/resolver.ts to your project, then:
// opencode.json
{
"plugins": ["plugins/gsd-bridge.ts"]
}Enable hooks:
{
"gsd-bridge-hooks-enabled": true
}Configuration
Create ~/.claude/settings.json to define hooks:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash|Edit|Write",
"hooks": [
{ "type": "command", "command": "/path/to/pre-hook.sh" }
]
}
],
"PostToolUse": [
{
"matcher": "Read",
"hooks": [
{ "type": "command", "command": "/path/to/post-hook.sh" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "command": "/path/to/stop-hook.sh" }
]
}
]
}
}Limitations
- No custom tool dispatch: Local
.tsplugins only receive event hooks, not function calls. Only theskilltool namespace works. Seedocs/model-routing.mdfor details. - Stop hooks are fire-and-forget:
session.idlecannot re-activate the agent in OpenCode, so Stop hooks cannot trigger agent continuation. - Depth limit:
@resolution stops at 5 levels of recursion to protect against circular references. - Missing files are skipped: Unresolvable
@refs are left as-is in the output.
License
MIT. Portions derived from oh-my-openagent (MIT/Apache-2.0).
