Repository navigation
Conversation
- Add hooks/opencode/rtk-v2.ts — OpenCode v2 plugin using Plugin.define
API with ctx.tool.hook('execute.before', ...)
- Add --opencode-v2 flag to rtk init CLI
- Embed OPENCODE_V2_PLUGIN via include_str! in installer
- Thread install_opencode_v2 through run(), run_default_mode(),
run_hook_only_mode(), run_claude_md_mode(), run_opencode_only_mode()
- ensure_opencode_plugin_installed() now accepts content parameter
- Validate --opencode and --opencode-v2 are mutually exclusive
- Update READMEs for hooks/ and hooks/opencode/
|
Uli seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account. You have signed the CLA already but the status is still pending? Let us recheck it. |
|
import { spawn } from "child_process"
// RTK OpenCode v2 plugin — rewrites commands to use rtk for token savings.
// Requires: rtk >= 0.23.0 in PATH.
//
// OpenCode 2.0 uses a new plugin API (Plugin.define + ctx.tool.hook) and does
// not provide the v1 bun-shell `$` helper, so this variant spawns `rtk`
// directly. `rtk rewrite` exits non-zero even on success, so we read stdout
// from the child instead of relying on exit codes.
//
// This is a thin delegating plugin: all rewrite logic lives in `rtk rewrite`,
// which is the single source of truth (src/discover/registry.rs).
// To add or change rewrite rules, edit the Rust registry — not this file.
function rtkRewrite(command: string): Promise<string> {
return new Promise((resolve) => {
const proc = spawn("rtk", ["rewrite", command], { windowsHide: true })
let out = ""
proc.stdout.on("data", (d) => {
out += d
})
proc.on("error", () => resolve(""))
proc.on("close", () => resolve(out.trim()))
})
}
export default {
id: "rtk.rewrite",
setup: async (ctx) => {
await ctx.tool.hook("execute.before", async (event) => {
const tool = String(event.tool ?? "").toLowerCase()
if (tool !== "bash" && tool !== "shell") return
if (!event.input || typeof event.input !== "object") return
const command = (event.input as Record<string, unknown>).command
if (typeof command !== "string" || !command) return
const rewritten = await rtkRewrite(command)
if (rewritten && rewritten !== command) {
;(event.input as Record<string, unknown>).command = rewritten
}
})
},
} |
|
Closing this one in favour of #3899, which adds the same OpenCode 2.0 support inside the existing plugin file so both plugin formats are handled automatically and no separate --opencode-v2 flag is needed. If the separate-file approach still matters for your setup, a comment on #3899 is the best place to raise it. |
Summary
hooks/opencode/rtk-v2.ts— OpenCode v2 plugin usingPlugin.define+ctx.tool.hook('execute.before', ...)withchild_process.spawn(v2 doesn't provide the bun-shell$helper)--opencode-v2flag tortk init, mutually exclusive with--opencodeOPENCODE_V2_PLUGINviainclude_str!; thread through all sub-functionsTest plan
cargo fmt --all && cargo clippy --all-targets && cargo test --allrtk rewriterewrites commands correctly (exit code 3 handled)rtk init -g --opencode-v2installs the v2 plugin