0.52.0 (2026-10-13)
Features
- hook/opencode: support OpenCode V2, Desktop, and Windows (#3463, #3326) (311ebcb)
- rewrite: read a quoted fish -c script as fish (4d2184c), closes #2767
- rewrite: rewrite inner commands of a quoted fish -c wrapper (27a659f)
Bug Fixes
- ast-grep: route subcommands by the grammar ast-grep actually has (e0b2e85)
- ast-grep: route subcommands by the grammar ast-grep actually has (507422f)
- core: emit one trailing newline, not one on top of the output's own (be8d546)
- core: emit one trailing newline, not one on top of the output's own (5daca37)
- curl: forward stdin to curl so -d @- bodies are not dropped (a4f444e)
- diff: report a one-operand call as a usage error with exit 2 (fixes #4320) (1ed8c7c)
- discover: count sudo RTK_DISABLED=1 commands as bypass in analytics (4f9015f)
- discover: judge a bypassed segment as typed without the bypass (2d37b2d)
- discover: keep a trailing redirect when rewriting golangci-lint (aec5fa9)
- gain: report a missing hook on every view (7231fd2)
- gain: report a missing hook on every view, not just the default one with data (5019e9c)
- gh: drop rtk's own
--, keep the user's (2b236d0) - gh: keep a lone escaped flag behind the boundary too (6433b7d)
- gh: keep an escaped flag behind the boundary (0cc1eca)
- gh: restore
--over the whole subcommand region (99eac0f) - gh: tokenize gh args instead of walking them by hand (e4f0509)
- gh: tokenize gh args instead of walking them by hand (3cbcb63)
- glab: tokenize glab args instead of walking them by hand (df39e33)
- go: drop non-JSON surfacing and pin failing-fuzz precedence (4daca6a)
- go: keep the final fuzz stats in the go test summary (c356374)
- hook: defer on a denied command inside a prefixed shell wrapper (ffa5651)
- hook: defer when a prefixed shell wrapper's script hits a deny rule (4d37aa8)
- hook: keep
caseterminators intact when rewriting (#3197) (e12ca86) - hook: keep
caseterminators intact when rewriting (#3197) (5e92ea4) - hook: match namespaced bash tool name in the Vibe hook (0eddb84)
- hook: match the Vibe bash tool name exactly (d47ef69)
- hooks/opencode: drop the
rtk-prefix skip (60cc80c) - hooks/opencode: honour RTK_DISABLED=1 (bedcc2c)
- hooks/opencode: judge only the rules OpenCode applies, and keep init honest (4775f69)
- hooks/opencode: probe for the subcommand, resolve from PATH, forward the agent (0037bf4)
- hooks/opencode: probe with
rtk --versionand require rtk >= 0.51.1 (a96d57e) - hooks/opencode: read OpenCode 2.x's native permission rules (0c1cb3a)
- hooks/opencode: read OpenCode's rules the way OpenCode resolves them (286db6e)
- hooks/opencode: say which RTK_DISABLED is which (bf9fdee)
- hooks/opencode: skip commands that already invoke rtk (b7612eb)
- hooks: close three permission-gate holes in command segmentation (4932d16)
- hooks: close three permission-gate holes in command segmentation (3992e0a)
- hooks: judge OpenCode against its own permission rules (cf018af)
- hooks: judge OpenCode against its own permission rules (aaa8ad0)
- hooks: report a status to OpenCode only when the rewrite changes it (0857629)
- hooks: skip the OpenCode rewrite when it would change the verdict (4ddc78d)
- init/opencode: drop the floor helper the refactor orphaned (d222aa5)
- init/opencode: drop the legacy plugin, floor at 1.18.29 (9513636)
- init/opencode: leave the plugin alone on an OpenCode that cannot load it (f2701a7)
- init/opencode: serve OpenCode <= 1.3.3 a legacy plugin (8f365e9)
- init: fail closed on missing .claude dir and hoist OpenCode install (fixes #4046) (b931928)
- jest: run the hook integrity check for rtk jest, and pin what vitest and jest spawn (58d2502)
- ls: match the ls the child will actually be (93166b9)
- ls: parse arguments through the tokenizer (e7a614c)
- ls: parse arguments through the tokenizer (ec96ab4)
- mvn: read goals through arg_tokenizer, not a dash scan (ef53d65)
- mvn: read goals through arg_tokenizer, not a dash scan (6f7de39)
- pipe: strip ANSI before pytest filter in pipe mode (404511d)
- pipe: strip ANSI before the pytest filter in pipe mode (8533612)
- pytest: strip ANSI inside filter_pytest_output (a249a90)
- rewrite: defer on fish's
&|pipe inside a -c wrapper (3e1188d) - rewrite: leave the pairs an ampersand opens to zsh, and strip grammar from an inner segment (b969c3a)
- rewrite: rewrite inner commands of quoted sh/bash/zsh -c wrappers (7cc2699), closes #2767
- tests: isolate the glab tests' data and follow the blob hint's new text (a345ebf)
- tests: repair the tests broken by the #4001 and #4005 merges (eb225a1)
- tokenizer: derive the /flag guard from the attach axis (29b3e3f)
- tokenizer: pin the contracts the new presets rely on (cd9d7a6)
- tracking: count
rtk uvrows as python in ecosystem mix (aaa2fba) - tracking: store commands so they read back as the same words (dd9edb5)
- tracking: store commands so they read back as the same words (87d1b18)