apps/docs/skills/lspeasy-client/SKILL.md
Documentation site for lspeasy Use when: You are implementing a custom client layer and need the same validation....
npx skillsauth add pradeepmouli/lspeasy lspeasy-clientInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Documentation site for lspeasy
Use @lspeasy/client when you need to build the consumer side of the
Language Server Protocol — an editor extension, a CLI analysis tool, a test
harness, or any process that speaks to a language server process.
The primary entry point is LSPClient. Construct it with
ClientOptions, call connect(transport) to complete the LSP
handshake, then use expect<ServerCaps>() to get typed access to
capability-aware namespaces (e.g. client.textDocument.hover(params)).
Stdio (StdioTransport from @lspeasy/core/node)
— Use when: spawning the language server as a child process (the canonical
editor extension pattern). Zero network overhead; server and client share
a lifespan. Failure mode: server process dies silently → stdout EOF fires
onClose; pair with HeartbeatMonitor on long-lived processes.
WebSocket (WebSocketTransport from @lspeasy/core)
— Use when: the language server runs remotely (CI, container, cloud dev env)
or must be browser-accessible. Supports reconnect with exponential back-off.
Failure mode: network partition → onError fires without onClose;
enable enableReconnect and subscribe to ConnectionHealthTracker events.
TCP (TcpTransport from @lspeasy/core/node)
— Use when: you need a persistent local socket and control both ends
(e.g. a test harness or a daemon that outlives the client process).
Failure mode: port conflict at startup; use mode: 'client' only after
confirming the server is listening, or wrap in a retry loop.
DedicatedWorkerTransport (DedicatedWorkerTransport from @lspeasy/core)
— Use when: running the language server in a Web Worker for browser isolation.
Zero latency (shared memory), no WebSocket overhead. Failure mode: worker
uncaught exception terminates silently; subscribe to worker.onerror.
Use ConnectionHealthTracker and HeartbeatMonitor to detect silent transport failures. Subscribe to state-change events via ConnectionState.
The client handles client/registerCapability and
client/unregisterCapability requests from the server automatically,
updating the typed namespaces at runtime.
Use this skill when:
LSPClient uses. Otherwise this is an internal detail. → use CapabilityGuardConnectionHealthTracker — for example, to show a status indicator, trigger reconnection logic, or surface transport errors to users.HeartbeatMonitor — for example, when the server process dies without closing the socket, leaving the client hanging indefinitely on pending requests.NotificationWaiter — for example, waiting for textDocument/publishDiagnostics after saving a document.Do NOT use when:
HeartbeatMonitor)LSPClient.onNotification for persistent subscriptions instead. (NotificationWaiter)API surface: 5 classes, 11 types, 2 enums, 1 constants
CapabilityGuard before the initialize handshake completes. Server capabilities are only known after the InitializeResult is received; instantiating the guard too early will treat all methods as unsupported.initialize request — the server may send the corresponding requests, but without the capability declaration the client has no contract to handle them, leading to silent failures or unexpected errors.getHealth() — it is a defensive copy but consumers that store a reference and then modify it will see stale state.setState from outside LSPClient internals. External callers have no knowledge of the full state-transition graph; setting state directly can desync the client's internal bookkeeping from the tracker's reported state.interval shorter than the typical round-trip latency for your transport — doing so causes constant onUnresponsive callbacks on any non-local transport, triggering spurious reconnects.NotificationWaiter without setting a timeout — an indefinite wait will leak the waiter permanently if the notification never arrives (e.g. the server suppresses it for certain file types).NotificationWaiter to wait for notifications that arrive before the waiter is registered. The waiter only sees notifications emitted after start() is called; earlier notifications are silently missed.4 configuration interfaces — see references/config.md for details.
Client: CapabilityGuard (Validates outgoing client requests and notifications against the server's
declared capabilities), ClientCapabilityGuard (Validates that server-to-client handler registrations are backed by
client capabilities declared in the initialize request), ConnectionHealthTracker (Tracks connection state transitions and message activity timestamps), HeartbeatMonitor (Runs interval-based heartbeat checks for active transports), NotificationWaiter (Tracks a single wait-for-notification operation and its timeout lifecycle), LSPClient (Typed LSP client that connects to a language server, manages the LSP
handshake, and exposes capability-aware request namespaces), InitializeResult (Initialize result from server), CancellableRequest (Return value of LSPClient), NotebookDocumentNamespace(Namespace for sending notebook-document lifecycle notifications to a server),ConnectionHealth(Aggregated connection health snapshot returned byLSPClient), HeartbeatStatus (Snapshot of the current heartbeat monitoring status), StateChangeEvent (Payload emitted when the connection state changes), ConnectionState (Lifecycle state of an LSPClient connection), LSPClient (Constructs an LSPClient instance)
types: PartialRequestResult (Result returned by partial-result enabled requests)
Transport: Transport (Pluggable communication layer for JSON-RPC message exchange)
Logging: Logger (Structured logging interface used throughout lspeasy), LogLevel (Numeric severity levels for filtering log output)
Lifecycle: Disposable (Represents a resource that can be explicitly released)
Load these on demand — do NOT read all at once:
references/classes.md for properties, methods, and inheritancereferences/types.mdreferences/variables.mdreferences/config.md for all settings and defaultstools
Use for ANY rename, file-move, or move-symbol refactor — especially rename-heavy work across multiple files. Claude Code's built-in LSP tool is READ-ONLY (find references, but no rename / file-move / move-symbol). Hand-editing those refactors silently misses re-exports, aliased imports, type-only imports, and {@link} doc references. This skill drives a real language server via the `lspeasy` CLI to apply a correct WorkspaceEdit that catches every reference. Trigger when the user asks to rename a function/class/variable/type project-wide, move a file and fix its importers, or pull a symbol out into another module.
tools
Documentation site for lspeasy Use when: You are building a browser-based LSP client, a WebSocket-backed language....
tools
Use when working with lspeasy (client, core, server). Covers: lsp, language-server-protocol, lsp-client, language-client, jsonrpc, transport, lsp-server, language-server.
tools
Build LSP language servers with a simple, fully-typed API Use when: The client sets `partialResultToken` in the request params and you want to.... Also: lsp, language-server-protocol, lsp-server, language-server.