packages/shared-skills/skills/lsp-setup/references/haskell/README.md
haskell-language-server — haskell-language-server-wrapper --lsp.hs .lhsghcup install hlsThe -wrapper binary detects your project's GHC version and dispatches to the matching HLS build.
ghcup install hls (install ghcup via brew install ghcup or the official script)ghcup install hls (ghcup script from https://www.haskell.org/ghcup/)ghcup install hls (ghcup is installed via the Windows installer / PowerShell bootstrap)HLS needs a working GHC plus Cabal and/or Stack. Install a matching toolchain first:
ghcup install ghc
ghcup install cabal
Confirm it resolves:
command -v haskell-language-server-wrapper
Builtin — usually NO config needed (auto-resolved by extension). Configure only to set priority, init options, override extensions, or disable. Same JSON shape in .codex/lsp-client.json (Codex) AND .opencode/lsp.json (OpenCode/omo):
{ "lsp": { "haskell-language-server": { "priority": 100 } } }
For builtin ids in a PROJECT config, command is supplied automatically — only set priority/initialization/extensions/disabled/env. A fully custom (non-builtin) server with its own command must go in the USER config (~/.codex/lsp-client.json).
None commonly required. Per-project plugin/formatter settings normally live in a hie.yaml (cradle) and .haskell-language-server files rather than init options.
ghcide (the core HLS engine, standalone) — largely superseded by HLS.hlint standalone for lint-only checks; ormolu/fourmolu for formatting.haskell-language-server-wrapper on PATH; reopen shell after ghcup install.ghcup install hls for that GHC, or align GHC to a supported one.hie.yaml; generate one with gen-hie > hie.yaml.bun ../../scripts/verify-lsp.ts path/to/file.hs