Help us improve
Share bugs, ideas, or general feedback.
From bee
Performs precise dependency analysis using LSP tools: find-references, call-hierarchy, go-to-definition. Builds dependency graphs, quantifies coupling (fan-in/fan-out), and calculates blast radius for code changes.
npx claudepluginhub incubyte/ai-plugins --plugin beeHow this skill is triggered — by the user, by Claude, or both
Slash command
/bee:lsp-analysisThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Claude Code provides built-in LSP (Language Server Protocol) tools that give you semantic code understanding — actual dependency graphs instead of text pattern matching. When LSP is available, use it. When it's not, fall back to grep/glob silently.
Performs 9-phase code reviews using LSP tools across any programming language, analyzing structure, dependencies, types, quality, and refactoring safety.
Guides LSP-first code navigation using goToDefinition, findReferences, workspaceSymbol, hover, implementations, and call hierarchies over grep/glob. Activates for symbol search or code exploration queries.
Installs and configures LSP servers for Claude Code to enable go-to-definition, find-references, rename-symbol, and real-time diagnostics in Python, TypeScript/JS, Go, Rust, Java, C#, PHP, Kotlin, Ruby, and more.
Share bugs, ideas, or general feedback.
Claude Code provides built-in LSP (Language Server Protocol) tools that give you semantic code understanding — actual dependency graphs instead of text pattern matching. When LSP is available, use it. When it's not, fall back to grep/glob silently.
This skill applies to any agent that performs code analysis — coupling, test coverage, architecture boundaries, migration scoping, or structural understanding.
| Operation | What it does | Use it for |
|---|---|---|
find-references | Find all usages of a symbol across the workspace | Dependency mapping, counting consumers of exports, detecting cross-boundary calls |
call-hierarchy (incoming) | Find all functions that call the target function | Afferent coupling — who depends on this? Blast radius of a change |
call-hierarchy (outgoing) | Find all functions the target function calls | Efferent coupling — what does this depend on? Transitive dependency depth |
go-to-definition | Jump to where a symbol is defined | Resolving what an imported symbol actually is, following re-exports |
hover | Get type information and documentation for a symbol | Type info for complexity assessment, understanding interfaces without reading source |
document-symbols | List all symbols in a file (functions, classes, interfaces) | Module structure overview, listing exports, quick structural scan |
workspace-symbols | Search for symbols by name across the entire workspace | Finding types, interfaces, or classes by name across the codebase |
LSP responses are graph edges, not search results. Each find-references call returns edges in a dependency graph. Each call-hierarchy call returns paths through that graph. Build the graph, then reason over it.
Transitivity. Don't stop at direct callers or callees. Use call-hierarchy to follow chains. If A calls B and B calls C, then A depends on C. Grep only shows you A→B and B→C as separate matches — LSP gives you the chain directly.
Completeness. find-references returns ALL usages, not a sample. Count them. "3 callers" vs "47 callers" is the difference between loosely coupled and tightly coupled. Grep misses re-exports, aliased imports, inherited methods, and framework-injected references.
Quantify coupling with fan-in and fan-out.
Blast radius = incomingCalls depth. How far does a change propagate through the call graph? A function with 3 direct callers might have 50 transitive dependents.
Testability = outgoingCalls depth. How many things must be mocked or stubbed to test this in isolation? A function with 1 import but 15 transitive outgoing calls is not a low-hanging fruit for unit testing.
Why this matters more than grep. Grep finds text matches. LSP finds semantic connections. Grep misses:
When you have LSP data, reason over the graph structure. When you don't, acknowledge that grep-based analysis is an approximation.
Check LSP availability once at the start of your analysis, not per-operation.
document-symbols on one of the target files.Decide once. Don't retry LSP after it fails — repeated failures waste time and add noise. Set a flag and move on.
When LSP is not available:
find-references for dependency mapping, the fallback is Grep for import/require patterns. If it used call-hierarchy for coupling depth, the fallback is reading files and tracing calls manually.Include one of these phrases in your analysis output so the developer knows the confidence level:
Place this near the top of the output, before the findings. This is a single line — not a paragraph, not a disclaimer.
| Language | LSP Server |
|---|---|
| TypeScript / JavaScript | typescript-language-server |
| Java | jdtls (Eclipse JDT Language Server) |
| Go | gopls |
| Python | pyright |
| Rust | rust-analyzer |
| C / C++ | clangd |
| Ruby | solargraph |
| C# | omnisharp |
| Kotlin | kotlin-language-server |
| PHP | intelephense |
| Swift | sourcekit-lsp |