The language server
nexus-lsp speaks the Language Server Protocol over stdio, so any editor with LSP support gets
live diagnostics, completion, and hover for .flow.md files — not only VS Code. It parses with the
same code the compiler does, so a file that shows no diagnostics parses.
Diagnostics
The document is parsed on open and on every change, and two kinds of problem are reported in place.
Parse errors — the wrong fence language, a malformed step header, an unterminated front matter. The position comes from the parser’s own span, so it points at the character that failed rather than at the line. Parsing is resilient: a broken step does not suppress the diagnostics on the steps around it.
Semantic warnings on the steps that did parse, anchored on the ## Step: line:
| What it catches | Severity |
|---|---|
A step with no body, no effects and no save_body:/restore_body: — a no-op, silently skipped |
warning |
An empty ntd template or an empty xslt stylesheet — produces null at runtime |
warning |
A route fence with no arms — always fails with NoRouteMatch |
error |
A route arm with no call target, or a route with no otherwise fallback |
warning |
A condition fence in a flow with no async configuration — see ADR-023 in Conditions |
warning |
A validate fence on the input of an async flow — nothing upstream called out, so a failed validation would retry to the DLQ with the same message. A validate placed after an http_egress or grpc_egress step is reading the backend’s answer and is not flagged |
warning |
effects: [http_egress] with no endpoint: |
warning |
If the parser itself ever panics, the server publishes that as a diagnostic rather than dying — an editor whose language server has died shows no diagnostics at all, which looks like a clean file.
Completion
Context-aware:
| Where you are | What is offered |
|---|---|
Between the --- delimiters |
Front-matter keys |
Just after ``` |
Fence languages |
After a ## Step: header, before the first fence |
Step keys |
Inside a ## Fault: section |
Additionally the deprecated fault_status: and fault_header_*:, offered nowhere else and labelled as deprecated with the current name |
Triggered by :, space and `, as well as on request.
Hover
Hovering inside a step shows its name, its kind and the effects it declares — useful in a long file where the fence that defines a step’s behaviour has scrolled away.
What it does not catch
The diagnostics above are the whole semantic list; everything else is a compile-time check and
surfaces elsewhere. nexus validate runs the whole compiler, so it is where most of them appear:
an unknown step key, an unresolvable sub-flow reference, a timestamp rendered as text, a header
field read with an underscore instead of brackets, a ctx. name that nothing declares, a
response_status: outside 100–599, and a response header the platform reserves. Only one check
needs more than the file: a message ceiling above what the installation allows is refused by
nexus deploy, because the threshold it is compared against is a setting of the installation. Run
at least nexus validate before deploying.
Running it standalone
$ nexus-lspAdvertised capabilities:
| Capability | Detail |
|---|---|
| Text document sync | Full document on every change |
| Completion | Triggered by : and space |
| Hover | Plain support |
Configure your editor to launch nexus-lsp for .flow.md files. There are no command-line
options and no configuration file — the server takes the document from the client and needs
nothing else, so it does not read your registry and does not need the platform running.
The binary ships built, in the delivery bundle, next to the two .vsix files and the script
that installs all three — see the VS Code extensions. It goes
anywhere on your PATH.