[BUG] LSP goToDefinition silently drops results in git-ignored paths
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Summary
The LSP tool's goToDefinition (and goToImplementation) operations silently filter out results that point to files in git-ignored directories (e.g., .venv/, node_modules/). This makes it impossible to navigate to definitions in external packages.
I have copied most of the text for this issue from the original one at https://github.com/anthropics/claude-code/issues/32373 . While it was closed, the issue is still present at least for the Typescript LSP plugin.
Root Cause
In the LSP tool's call handler, results from goToDefinition, findReferences, goToImplementation, and workspaceSymbol are passed through a filter that:
Extracts file URIs from the LSP response
Runs git check-ignore on those paths
Removes any locations where git check-ignore returns exit code 0
Since .venv/ is typically git-ignored (both by project .gitignore and by .venv/.gitignore auto-generated by venv/uv which contains *), all definitions in external packages are silently dropped.
Suggested Fix
Add a configuration option to control the git check-ignore filtering behavior per LSP operation. For example, a setting like:
// .claude/settings.json or similar
{
"lsp": {
"gitIgnoreFilter": {
"goToDefinition": false,
"goToImplementation": false,
"findReferences": true,
"workspaceSymbol": true
}
}
}
The default could remain as-is for backwards compatibility, but users working with external dependencies should be able to opt out of the filter for navigation operations like goToDefinition and goToImplementation, which return a small number of precise results (usually 1) where filtering adds no value.
The relevant code path (from compiled binary analysis):
// Current: unconditionally filters all these operations through git-ignore check
if (M && Array.isArray(M) && (
H.operation === "findReferences" ||
H.operation === "goToDefinition" ||
H.operation === "goToImplementation" ||
H.operation === "workspaceSymbol"
)) {
// ... runs git check-ignore, drops ignored paths
}
What Should Happen?
The LSP should be allowed to navigate to external modules, even if they are in gitignored directories.
Error Messages/Logs
Steps to Reproduce
Repro 1: Typescript LSP simarmol/lsp-repro
Follow the instructions in the repo.
Claude Model
Not sure / Multiple models
Is this a regression?
No, this never worked
Last Working Version
_No response_
Claude Code Version
2.1.140
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
_No response_
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗