* Implement Ruby dual language server support with ruby-lsp and Solargraph
- Add ruby-lsp as primary Ruby language server with modern LSP features
- Mark Solargraph as experimental legacy option (ruby_solargraph enum)
- Implement Bundler-first installation strategy for ruby-lsp
- Add Rails project detection and performance optimizations
- Fix LSP protocol compliance for Solargraph (languageId: "ruby")
- Support both .rb and .erb files for ruby-lsp, .rb only for Solargraph
- Address reviewer feedback on dependency management and error handling
- Update test compatibility for dual language server behavior
Co-authored-by: Claude <noreply@anthropic.com>
Add _extend_nix_symbol_range_to_include_semicolon method to prevent
double semicolons
Add test_nix_symbol_replacement_no_double_semicolon to validate the fix
rust-analyzer now requires rustup to be installed
## Motivation
The previous implementation bundled rust-analyzer binaries that quickly
became outdated and required manual updates to Serena's codebase. This
caused version mismatches between the bundled rust-analyzer and users'
actual Rust toolchain versions.
## Changes
- Remove RuntimeDependency-based binary bundling for rust-analyzer
- Use rustup-managed rust-analyzer from the user's toolchain
- Add automatic installation of rust-analyzer component if missing
- Install rustup with minimal profile in Docker images
## Rationale
Rust development universally relies on rustup for toolchain management.
Unlike some other languages where system packages or bundled binaries
make sense, Rust developers already have rustup installed and expect
tools to use their toolchain's versions.
This approach ensures:
- rust-analyzer always matches the user's Rust version
- No outdated binaries shipped with Serena
- Automatic updates via `rustup update`
- Consistency with Rust ecosystem expectations
The LSP API of rust-analyzer is stable enough that version differences
are not a concern. If users don't have rustup, they'll get a clear error
message - this is acceptable since you cannot meaningfully develop Rust
without rustup.
## Docker Support
Added rustup installation to Docker images to ensure Rust support works
in containerized environments. Uses minimal profile to reduce image size
while still providing full rust-analyzer functionality.