claw-code/docs/pr-3219-plan.md

162 lines
6.4 KiB
Markdown

# PR #3219 — Execution Plan: LSP Integration v3
**Branch**: `worktree-lsp-v3`
**Worktree**: `.claude/worktrees/wf_616683a9-d46-5`
**CI State**: **Build ❌** Test ❌ Fmt ✅ Clippy ✅ Docs ✅ Windows ✅
## Reviewer Feedback
From `1716775457damn`:
> "This is an impressive piece of work. The modular split across 4 crates with 58 unit tests is exactly the right architecture. The lazy-start pattern and diagnostic enrichment in tool output make this genuinely useful.
>
> Two things to check before merge:
> - build and cargo test are currently failing in CI — worth investigating if these are test assertions that need updating for the new LSP types
> - The auto-discovery of 14 LSP servers via PATH probing is great, but consider adding a `claw lsp status` command so users can confirm which servers were discovered and their health"
## Investigation Findings
### CI failure: same slash command count issue as #3218
The test `renders_help_from_shared_specs` asserts `slash_command_specs().len() == 139`, but this PR adds `/lsp` (1 new command), making it 140. Same pattern as #3218.
Locally confirmed:
```
assertion `left == right` failed
left: 140
right: 139
```
Both Build ❌ and Test ❌ are from this single test failure.
### LSP module architecture
The LSP code lives as **modules within the `runtime` crate** (not separate crates), despite the PR description:
- `rust/crates/runtime/src/lsp_discovery.rs` — auto-discovery of 14 LSP servers
- `rust/crates/runtime/src/lsp_client/` — LSP client lifecycle, dispatch, types
- `rust/crates/runtime/src/lsp_transport/` — transport layer
- `rust/crates/runtime/src/lsp_process/` — process management
### Current `/lsp` command state
The `/lsp` slash command is **registered but not implemented** — executing it just prints "not yet implemented in this build." at `main.rs:6124`.
The `SlashCommand::Lsp` variant has `action: Option<String>` and `target: Option<String>`, so it supports:
- `/lsp` (no args)
- `/lsp status`
- `/lsp start <target>`
- `/lsp stop <target>`
- `/lsp list`
### Available LSP discovery API
Currently exported from `runtime`:
- `discover_available_servers()``Vec<LspServerDescriptor>` — servers found on PATH
- `known_lsp_servers()``Vec<LspServerDescriptor>` — all 14 known servers
- `find_server_for_file(path)``Option<LspServerDescriptor>` — server for a file extension
- `command_exists_on_path(cmd)``bool` — check if a binary is available
Not exported but available:
- `check_lsp_availability()``Vec<LspInstallAction>` — detailed status (Installed/Missing/RustupProxyMissing)
- `format_install_prompt(actions)``String` — human-readable install instructions
### `LspInstallAction` variants
```rust
pub enum LspInstallAction {
Installed,
Missing { language: String, instructions: Vec<InstallInstruction> },
RustupProxyMissing { language: String, component: String },
}
```
## Execution Plan
### Step 1: Fix CI — update slash command count
Change `139``140` at `commands/src/lib.rs:5246`. Add `/lsp` assertion to the test.
### Step 2: Export `check_lsp_availability` and related types from runtime
Add to `runtime/src/lib.rs` pub use:
- `check_lsp_availability`
- `LspInstallAction`
- `InstallInstruction`
- `format_install_prompt`
### Step 3: Implement `/lsp` slash command handler in main.rs
Replace the "not yet implemented" stub with a handler that dispatches on `action`:
| Action | Behavior |
|--------|----------|
| `None` or `"status"` | Show all discovered servers, their availability, and install hints for missing ones |
| `"list"` | List known LSP servers (all 14) with availability status |
| `"start"` / `"stop"` | Print "not yet available" — lazy-start is handled by tool infrastructure, not manual commands |
The `status` output format:
```
LSP Server Status (14 known, X available):
✅ rust-analyzer — .rs files [installed]
✅ typescript-language-server — .ts/.tsx/.js/.jsx [installed]
❌ gopls — .go files [missing: go install golang.org/x/tools/gopls@latest]
❌ pylsp — .py files [missing: pip install python-lsp-server]
⚠️ rust-analyzer — .rs files [rustup proxy: run `rustup component add rust-analyzer`]
Run /lsp list for all known servers.
```
### Step 4: Update the test assertions
Add `assert!(help.contains("/lsp"))` to `renders_help_from_shared_specs`.
### Step 5: Verify — cargo test -p commands, cargo test -p runtime, cargo test -p rusty-claude-cli
### Step 6: Commit + push
## Commit Details
**Commit**: `369452c` on `worktree-lsp-v3`
```
fix: address CI failure and implement /lsp status command
- Fix renders_help_from_shared_specs test: update
slash_command_specs().len() from 139 to 140. The /lsp command
added by this PR increased the spec count by 1 but the test
was not updated. Also add assert!(help.contains("/lsp")).
- Export check_lsp_availability, LspInstallAction,
InstallInstruction, and format_install_prompt from the runtime
crate's public API so the CLI can access LSP discovery status.
- Implement /lsp slash command handler:
- /lsp or /lsp status — show all known LSP servers with
availability (installed ✅, missing ❌ with install hint,
rustup proxy ⚠️)
- /lsp list — list all known servers with language and extensions
- /lsp start/stop — note that lazy-start is automatic, not manual
Addresses reviewer feedback on #3219 requesting a way for
users to confirm which LSP servers were discovered and their
health.
```
**Files changed**:
- `rust/crates/commands/src/lib.rs` — update count 139→140, add `/lsp` assertion
- `rust/crates/runtime/src/lib.rs` — export `check_lsp_availability`, `LspInstallAction`, `InstallInstruction`, `format_install_prompt`
- `rust/crates/rusty-claude-cli/src/main.rs` — implement `/lsp` slash command handler replacing "not yet implemented" stub, add runtime imports
## Acceptance Criteria
- [x] `slash_command_specs().len()` assertion updated to 140
- [x] `/lsp` content assertion added
- [x] `check_lsp_availability` and related types exported from runtime
- [x] `/lsp status` shows discovered servers with availability + install hints
- [x] `/lsp list` shows all known servers
- [x] `cargo test -p commands` passes (42 tests)
- [x] `cargo test -p runtime` (LSP tests) passes (58 tests)
- [x] `cargo build -p rusty-claude-cli` passes
- [x] Changes committed and pushed (commit `369452c`)
- [x] 8 pre-existing CLI test failures (local config parse issue) — not from our changes