Extensions add language-specific tools beyond what LSP exposes. The core 50 tools cover everything the language server protocol provides; extensions run arbitrary toolchain logic for a specific language.
Go extension (Wave 1 — test + module intelligence)¶
Tool
Description
go.test_run
Run a specific test by name, return full output + pass/fail
go.test_coverage
Coverage % and uncovered lines for a file or package
The gap between what clangd provides and what the broader toolchain offers is larger than any other language — sanitizers and profiling are completely outside LSP scope.
Tool
Description
cpp.tidy
clang-tidy diagnostics for a file (beyond clangd's built-in checks)
cpp.static_analysis
cppcheck output with structured findings
cpp.asan_run
Build and run with AddressSanitizer, return memory error output
Current skills are oriented around modifying existing code. These skills target greenfield creation workflows where LSP can still add value through completions, diagnostics, and code actions.
Skill
Description
/lsp-create
Iterative file creation with diagnostic checks between steps. Create file, open in LSP, write incrementally, verify diagnostics after each addition, format on completion. /lsp-safe-edit for files that don't exist yet.
/lsp-implement (extend)
Given an interface or type definition, generate the full implementation using get_completions to discover required methods, verify it compiles via diagnostics, format.
/lsp-discover-api
Completion-driven API exploration. Open a file, place the cursor after a package qualifier, call get_completions to show available methods/fields. Use LSP knowledge instead of training data (which may be outdated).
/lsp-bootstrap
Project scaffolding with LSP verification. Create build files (go.mod, package.json, Cargo.toml), start LSP, confirm indexing works, verify initial diagnostics are clean before writing application code.
/lsp-wire
After creating a new package/module, verify it's importable from the intended consumer, check the public API surface via get_document_symbols, confirm no dangling imports or missing exports.
Skills calling other skills. /lsp-refactor is already composed from /lsp-impact + /lsp-safe-edit + /lsp-verify + /lsp-test-correlation. Formal runtime support for skill-to-skill invocation would enable arbitrary composition.
Skills are currently prose — markdown prompts the agent follows. The inputs and outputs are implicit and unvalidatable. A schema layer would make contracts explicit — what goes in, what comes out — enabling validation and eventual skill composition with typed interfaces.
The case for machine-readable skill contracts:
- Tooling can validate that an agent invoked a skill correctly
- Clearer interface between the agent and the skill — what goes in, what comes out
- Enables skill composition with type safety (skill A's output feeds skill B's input)
- Documentation that can be auto-generated and kept in sync
Feature
Status
Description
Skill input/output schema
Planned
JSON Schema definitions for each skill's expected inputs and guaranteed outputs — machine-readable contracts alongside the prose skill files
Schema validation tooling
Planned
Validate agent skill invocations against the schema at runtime or in CI — surfaces misuse before it causes silent failures
agent-lsp already works with any IDE that has an MCP client (VS Code via Continue/Cline, JetBrains via AI Assistant, Cursor, Windsurf, Neovim via mcp.nvim). The items below improve this from "works" to "native."
Passive mode (connect to existing language servers)¶
agent-lsp currently launches and manages its own language server processes. In IDE environments, the IDE already has gopls/pyright/rust-analyzer running and indexed. Passive mode would connect to an already-running server instead of spawning a duplicate, eliminating double-indexing and double memory usage.
Some language servers support multi-client connections over TCP (gopls supports gopls -listen=:9999). Passive mode would connect to these sockets and share the IDE's warm index. No IDE plugin required for this path.
Feature
Status
Description
--connect transport
Planned
Connect to an existing language server TCP socket instead of spawning a new process
Shared index
Planned
Reuse the IDE's warm language server index; no duplicate indexing or memory overhead
Auto-start agent-lsp, command palette for skills, inline diff preview for speculative execution, code lens for blast-radius annotations
JetBrains plugin
Planned
Single plugin for all JetBrains IDEs (GoLand, IntelliJ, PyCharm, WebStorm, CLion, Rider). Only needs com.intellij.modules.platform dependency since agent-lsp manages its own LSP connections. No language-specific module dependencies required.
Neovim plugin
Planned
Lua plugin using vim.lsp.buf_get_clients() to proxy requests through existing LSP connections
Instrument the existing test suite to capture per-language timing data on every CI run, then publish it as a public docs/metrics.md table. This turns CI from a pass/fail gate into a performance baseline.
New — timing harness, JSON serialization, WriteMetrics(path string)
test/multi_lang_test.go
Instrument TestMultiLanguage — wrap each tool call with time.Since, collect into LanguageMetrics struct
test/speculative_test.go
Expand to all supported languages (currently Go only); record speculative_confidence and speculative_round_trip_ms per language
.github/workflows/ci.yml
Add upload-artifact step per language job; add collect-metrics job that runs after all language jobs, downloads all artifacts, and commits merged metrics.json to a metrics branch
scripts/generate-metrics.py
New — reads metrics/<language>.json files, computes p50/p95 after 5+ runs from metrics/history.json, renders docs/metrics.md
docs/metrics.md
Generated output — markdown table with one row per language
After 5+ CI runs, generate-metrics.py reads metrics/history.json on the metrics branch and replaces single-run numbers with p50/p95 per metric. The history file is a JSON array of per-run records; the script appends the latest run and trims to the last 50 entries.
The agent-local pipeline (blast-radius → simulate → apply → verify → test) handles correctness for a single session. The control plane adds organizational primitives for teams running agents at scale.
Feature
Status
Description
Audit trail
Shipped
JSONL log of every apply_edit, rename_symbol, and commit_session call with timestamp, affected files, edit summary, pre/post diagnostic state, and net_delta. Configure via --audit-log flag or AGENT_LSP_AUDIT_LOG env var.
Change plan output
Planned
Materialize simulate_chain output as a structured, human-reviewable artifact before apply — files, edits, per-step diagnostic delta, safe-to-apply watermark. Three community members have independently requested this.
Policy gates
Planned
Configurable rules that block apply based on blast-radius thresholds, public API changes, or path patterns. Evaluate at apply time using the audit record.
Cross-session coordination
Planned
Shared state between concurrent MCP sessions — symbol-level lock registry to prevent overlapping renames/refactors. Requires a sidecar daemon or file-based coordination. The hardest piece.