lsp-cross-repo

SkillAI & models

Cross-repository analysis — find all callers of a library symbol in one or more consumer repos. Use when refactoring a shared library and need to understand how consumers use it.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the lsp-cross-repo skill

What this skill tells your AI

The instructions your AI receives, as published by blackwell-systems/agent-lsp in skills/lsp-cross-repo/SKILL.md and read by ahel’s review.

Requires the agent-lsp MCP server.

lsp-cross-repo

Multi-root cross-repo caller analysis for library + consumer workflows. Finds all usages of a library symbol across one or more consumer codebases in a single call.

Read-only — does not modify any files.

When to use

  • Before changing a library API: find all callers in every consumer
  • Before deleting a symbol: verify it has no cross-repo dependents
  • When a change in repo A might break repo B or C
  • Auditing how internal packages are used across services

Use /lsp-impact instead for single-repo blast-radius analysis.

Workflow

Step 1 — Initialize the primary workspace

Start the language server on the library root if not already running:

mcp__lsp__start_lsp({ "root_dir": "/path/to/library" })

Step 2 — Locate the library symbol

Find the symbol's definition to get file_path, line, and column:

mcp__lsp__find_symbol({ "query": "<symbol-name>" })

Pick the result in the library repo (not a test file).

Step 3 — Find all cross-repo references (primary step)

Call get_cross_repo_references with the symbol location and all consumer repo roots. This adds each consumer as a workspace folder, waits for indexing, runs find_references across all roots, and returns results partitioned by repo:

mcp__lsp__get_cross_repo_references({
  "symbol_file": "/abs/path/to/library/file.go",
  "line": <line>,
  "column": <column>,
  "consumer_roots": [
    "/abs/path/to/consumer-a",
    "/abs/path/to/consumer-b"
  ]
})

Returns:

  • library_references — usages within the library itself
  • consumer_references — a map of consumer-root → [file:line ...]
  • warnings — any roots that could not be indexed (check these manually)

Decision after Step 3:

ResultAction
No consumer refsSafe to change — verify warnings is empty first
Consumer refs foundRun /lsp-impact on each call site before editing
warnings non-emptyRe-add that root manually and retry Step 3

Step 4 — Callers and implementations (optional)

For a deeper look at how consumers call the symbol:

mcp__lsp__find_callers({
  "file_path": "<library-file>",
  "line": <line>,
  "column": <column>,
  "direction": "incoming"
})

For interfaces — all consumer-side implementations:

mcp__lsp__go_to_implementation({
  "file_path": "<library-file>",
  "line": <line>,
  "column": <column>
})

Output format

## Library-internal references
- file:line — brief context

## Consumer references

### /path/to/consumer-a
- file:line — brief context

### /path/to/consumer-b
- file:line — brief context

Decision guide

SituationAction
No consumer refs, warnings emptySafe to change
Consumer refs foundRun /lsp-impact on each call site before editing
warnings lists a consumer rootThat root failed indexing — check LSP logs
Consumer uses interface, not concrete typeUse go_to_implementation to find all implementors

Example

# Refactoring ParseConfig in a shared config library used by 3 services

start_lsp(root_dir="/repos/config-lib")
find_symbol(query="ParseConfig")        # find definition → file:42:6
get_cross_repo_references(
  symbol_file="/repos/config-lib/pkg/config/parser.go",
  line=42, column=6,
  consumer_roots=["/repos/api-service", "/repos/worker-service", "/repos/batch-job"]
)
# → library_references: 2
# → consumer_references: {api-service: [main.go:14, app.go:31], worker-service: [runner.go:8]}
# → warnings: []

Signals

GitHub stars
124
Forks
12
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
lsp-cross-repo
Source
github.com/blackwell-systems/agent-lsp