[BUG] LSP goToDefinition silently drops results in git-ignored paths

Resolved 💬 2 comments Opened May 21, 2026 by simarmol Closed May 25, 2026

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_

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗