Clean HTML page describing iLSP, what LSP is, the WebSocket endpoints,
and setup instructions for Neovim, IntelliJ and VS Code. Live stats
(Bicep modules, pipeline templates, PyPI packages) are rendered from
the in-memory catalog at request time.
No emojis. Minimal CSS, no external dependencies.
- yaml-language-server: rewrite to stdio per WebSocket (fixes crash loop)
vscode-jsonrpc v9 createServerSocketTransport is a TCP client, not server
now spawns yaml-language-server --stdio per connection via asyncio subprocess
- bicep/modules.py: add /iac_source_catalog.json as first path in _IAC_SOURCE_PATHS
Dockerfile copies to /iac_source_catalog.json but path wasn't listed
- server.py: remove YAML_LSP_PORT daemon (no longer needed with stdio mode)
- Makefile: add -e HTTP_PORT=$(HEALTH_PORT) to all docker run commands
server defaulted to :8000 but Makefile exposed :2089 with no override
asyncio.open_connection hangs indefinitely when backend port is silently
dropped. Add wait_for(timeout=3.0) so the WS close frame is always sent
within the test's 5s window.
- Remove static ports 2087/2088/2089 from Nomad; use one dynamic port
- pylsp and Bicep LS stay on localhost inside container (not exposed)
- aiohttp adds /python and /bicep WebSocket routes bridging to localhost LSPs
- Nomad env: HTTP_PORT=$NOMAD_PORT_http, internal ports fixed at 2087/2088
- Editors connect via ws://ilsp.i80.dk/python and ws://ilsp.i80.dk/bicep
- Traefik routes ilsp.i80.dk → single dynamic HTTP port
- Remove all DevOpsMCP/aiohttp runtime deps from BicepModuleCatalog
- BicepModuleCatalog.load() reads bicep_modules_catalog.json from disk at startup (sync)
- Fix _load_catalog: catalog uses dict {path: {versions, schema}} not a list
- server.py: call BicepModuleCatalog.load() synchronously, not via asyncio.gather
- Dockerfile: COPY bicep_modules_catalog.json into both builder + runtime stages
- Health endpoint now reports bicep_modules: 27
Verified locally: make run-quick → health returns pypi_packages:40 bicep_modules:27