The problem
Design principles
- Tool finds things itself —no file hint, no line numbers, no prior exploration required
- Confident output —state facts (“All references updated. No errors.”), never hedge (“Run tests to verify”)
- One call = complete job —the agent shouldn’t orchestrate multi-step mechanical workflows
- Know the project —toolchain, runner, linter detected automatically from config files
- Accept flexible input —symbol name instead of file path + line number
Why output tone matters
When a tool says “Run tests to verify”, the agent adds 3 verification steps. When a tool says “All references updated. No errors.”, the agent moves on. One step. See also: Code intelligence for the LSP and tree-sitter fallback chain that powers these tools.Tool reference
rename_symbol
No
file parameter needed. The tool locates the symbol itself via workspace search + grep fallback. Works across monorepos.
move_symbol
Per-language import handlers:
| Language | Support level |
|---|---|
| TypeScript/JavaScript | Full. Handles import { X }, import type { X }, require(), re-exports. Respects verbatimModuleSyntax. |
| Python | Handles from module import X, import module, bare imports. |
| Rust | Handles use crate::path::Symbol, mod declarations. |
| Go/C/C++ | Graceful degradation —moves the symbol but warns that imports need manual update. |
project
read_code
read_code returns only those 30 lines.
Falls through: tree-sitter extraction, regex extraction, full file with line range.
navigate
Benchmark
Single representative run onrename_symbol (renaming an exported class across 8 files):
| Metric | Before (manual) | After (compound) | Improvement |
|---|---|---|---|
| Agent steps | 19 | 3 | 84% fewer |
| Token cost | $0.228 | $0.036 | 84% cheaper |
- Grep fallback in
locateSymbol—tool finds the symbol itself - Confident output —no “verify” suggestions that trigger verification spirals
- Toolchain in context —
Toolchain: bunprevents wrong-runner retries