plugin: ship Go/Python/TS language servers in the global plugin#18
Merged
Conversation
Adds a .lsp.json to the global plugin that configure and launch build, so Claude gets go-to-definition, find-references, and post-edit type diagnostics in every session by default — no build step, no -P. writeGlobalLSP mirrors writeGlobalManifest: a fixed JSON file at the plugin root, rewritten every build (not refresh-gated like skills and styles) so an added server or schema change reaches existing installs. All three ship unconditionally; Claude Code skips a server whose binary is absent, so no toolchain detection is needed. Install: gopls (go install); pyright and typescript-language-server plus typescript@5 (npm). The @5 pin matters — typescript@latest is 7.x, which dropped the tsserver binary the language server drives.
Tanq16
force-pushed
the
feat/plugin-lsp-servers
branch
from
July 21, 2026 17:19
5838470 to
d4c8a18
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ships
gopls,pyright-langserver, andtypescript-language-serveras part of the global plugin thatconfigureandlaunchbuild, so Claude gets go-to-definition, find-references, workspace symbol search, and post-edit type diagnostics in every session by default — no-Pneeded, no build step.Where it lives
writeGlobalLSPininternal/plugins/plugins.golays a.lsp.jsonat the global-plugin root, mirroringwriteGlobalManifest:refresh-gated like skills/styles, so an added server or schema change reaches existing installs on the nextlaunchwithout needingconfigure.LookPathwould only reimplement platform behavior — and worse, bake toolchain presence in at build time so a latergo install/npm installwouldn't take effect until a rebuild.The repo-root
.lsp.json(which briefly shipped LSP via theclaudex-devplugin) is removed — keeping both would self-conflict on file extensions when this repo is loaded via-Palongside the global plugin, and Claude Code resolves that by silently dropping one.Servers
goplsgo install golang.org/x/tools/gopls@latestpyright-langservernpm install -g pyrighttypescript-language-servernpm install -g typescript-language-server typescript@5typescriptis a second package — the server drivestsserverand ships without it. The@5pin is load-bearing:typescript@latestis 7.x, which dropped thetsserverbinary, and the language server failsinitializeoutright against it (verified:Could not find a valid TypeScript installation ... Exiting).Verified
.lsp.jsonschema checked against aclaude plugin init --with lspscaffold on 2.1.209BuildGlobalPlugincode path with the actual embedded FS; inspected the generated.lsp.json— valid, all three servers, correct extension mapsLoaded 3 LSP server(s) from plugin: claudexgo build,go vet,gofmt, andgo test ./...all pass; added tests assert the file is written with the three commands and is rewritten even on a no-refresh buildNotes
--mcp nonedoes not suppress language servers (LSP is not MCP);claude --bareis the escape hatch. README says so.[no ci]is in the title and commits. This is now Go code shipping to every session — if you want a release cut for it, drop[no ci](and consider[minor-release]) at merge, sincemake versionreads the merge-commit subject.🤖 Generated with Claude Code