Skip to content

v0.37.0

Choose a tag to compare

@github-actions github-actions released this 10 Jun 21:33
· 2741 commits to main since this release

v0.37.0: Lower CPU, leaner tools

This release attacks the two complaints we heard most: AFT processes burning CPU in the background, and tool output/descriptions eating more of the agent's context than they should. It also removes a tool, trims several others, and lands a batch of correctness fixes across edits, imports, and search.

Much lower background CPU

A set of independent fixes targeting sustained CPU usage and spikes:

  • Idle bridges shut down after 30 minutes. Previously a bridge process stayed alive for every project you touched until the host exited. Bridges with running background tasks are never evicted, and a fresh bridge restores them on the next call.
  • Deleted project roots no longer spin the watcher. Removing a directory a bridge was watching (a worktree, a temp checkout) flooded it with delete events and pinned a core; the bridge now detects the deleted root and stops watching.
  • Background code-health scans reuse warm caches instead of re-parsing the project from scratch on every debounce, and their parsing pool is bounded to half your cores.
  • Semantic index loads and saves stream to disk instead of materializing multi-hundred-MB buffers, and the embedding pipeline no longer clones every batch.
  • Cold symbol scans read each file once instead of twice, and cold search-index builds parse in parallel.

aft_transform removed

aft_transform (add_member, add_derive, wrap_try_catch, add_decorator, add_struct_tags) is gone. Usage data showed agents essentially never called it — everything it did is covered by edit's symbol and find/replace modes, which agents already use fluently. Removing it shrinks every request's tool surface. If you listed it in disabled_tools, the entry is ignored harmlessly.

Leaner tool descriptions and smarter guidance

  • The bash, write, edit, apply_patch, aft_search, and aft_refactor descriptions were rewritten to be shorter and to only describe behavior that is actually enabled in your config — e.g. bash no longer advertises background: true when background execution is disabled.
  • The per-call diagnostics parameter on write/edit/apply_patch is gone; diagnostics flow through the status bar and aft_inspect, with lsp.diagnostics_on_edit as the config knob.
  • The system-prompt guidance was rewritten around what agents should do rather than what they shouldn't: concrete translations from bash habits to the right tool, and a clear protocol for waiting on background commands instead of polling them.

Background bash: right-sized completion reminders

Completion reminders for background tasks now size their output by how the task ended: a successful task shows a short tail, a failed task keeps the head plus a generous tail so the error context survives. Killed or timed-out tasks are treated as failures. Compressors also never render a success summary (N pass, 0 fail) for a command that exited non-zero.

Fixes

  • Failed refactors report failure: aft_refactor move/extract/inline now return an error when a syntax-validation rollback occurs, and a rolled-back destination write can no longer lose the moved symbol. write and apply_patch report rollbacks honestly too.
  • aft_import no longer writes a bare side-effect import when a model sends names as a JSON-stringified array; stringified arrays and bare strings are accepted, wrong types are rejected.
  • Organize imports preserves pub(crate)/pub(super) visibility in Rust and no longer drops modules from Python import os, sys statements.
  • ast_grep_replace rejects rewrite meta-variables the pattern never captures (e.g. a $MGS typo), instead of writing them as literal text.
  • Fuzzy edits preserve the trailing newline of the replaced region in batch mode (the v0.36.1 fix now covers all edit paths).
  • Outline/zoom symbol ranges are correct for Rust functions inside mod blocks, multi-declarator statements (const a = 1, b = 2), and Markdown/HTML heading sections; JavaScript files now extract top-level const/let symbols like TypeScript.
  • The sidebar no longer shows another project's data in multi-window or opencode -s setups, and reconnects more reliably.
  • LSP: a server installed mid-session is picked up on the next configure instead of requiring a restart; per-file diagnostic pulls honor their 10s cap; tsconfig with only a files list no longer treats the whole tree as members.
  • semantic.timeout_ms is honored up to the real transport budget (55s) instead of being silently clamped to 25s — slow local embedding backends (LMStudio cold-loads) no longer have their configured headroom cut, and background refresh batches stop getting aborted mid-embed.
  • Search: capped results are signaled in the output footer, and an uncapped parallel grep no longer falsely reports itself as capped.
  • Bash safety: commands with an explicit workdir outside the project root are never rewritten to AFT tools, and process-group kill works even after the leader exits.
  • Redirects to /dev/null and friends no longer trigger permission prompts (#106): device-file paths (/dev/null, /dev/stderr, numeric /dev/fd/N, ...) are skipped by the bash permission scanner, matching native shell behavior.
  • Windows: diagnostic reports redact user paths on all drives and slash styles.

Thanks to @jonmast (#107) for contributing to this release.

Join our Discord