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.
- Check if directory exists before calling validate_relative_path
- Return structured JSON error with project_root context when directory not found
- Helps LLMs understand the current working directory context in MCP
Similar to fix in commit 8464f25 for CreateTextFileTool
Previously, when a subdirectory .gitignore file contained patterns starting
with "**/", these patterns were incorrectly applied globally instead of being
scoped to that subdirectory's tree.
For example, if foo/.gitignore contained "**/test.txt", it would incorrectly
ignore test.txt files everywhere in the repository, including at the root
level and in other subdirectories like bar/test.txt.
The bug was in _parse_gitignore_content() where patterns starting with "**/"
were left unchanged (line 228: adjusted_pattern = line), making them global
instead of scoped.
Fixed by ensuring that even "**/pattern" gets the subdirectory prefix:
- Before: "**/test.txt" → "**/test.txt" (global)
- After: "**/test.txt" → "foo/**/test.txt" (scoped to foo/ subtree)
Added comprehensive test cases covering all gitignore pattern scenarios:
- Non-anchored patterns (foo.txt) - already worked correctly
- Anchored patterns (/foo.txt) - already worked correctly
- Double-star patterns (**/foo.txt) - was broken, now fixed
- Anchored double-star (/**/foo.txt) - already worked correctly
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Add optional Intelephense license key support via INTELEPHENSE_LICENSE_KEY environment variable
- Add initializationOptions support to Intelephense LSP server
- Pass license key via licenceKey property when environment variable is set
- Update README.md and DOCKER.md documentation with new environment variable
- Fix docstring comment in _get_initialize_params method
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix formatting
---------
Co-authored-by: Claude <noreply@anthropic.com>