Monogate Forge — VS Code extension
EML-lang language support for VS Code. Writing EML needs nothing
else; install the Forge CLI (pip install "monogate-forge[lsp]") to
add compile, analysis and verification. No license or account.
What you get for free (no CLI required)
- Syntax highlighting for
.eml files (TextMate grammar)
- Keywords:
module use as const type unit fn extern let mut where requires ensures assume while if else …
- Builtins:
exp ln log sin cos tan sqrt pow eml abs clamp asin acos atan sinh cosh tanh floor pi dot sum
and the builtin calls min max atan2 log10 exp10 step arcsin arccos arctan log2 cbrt expm1 log1p hypot fmod ceil trunc round
- Snippets for the common patterns:
fn, fnverify, module, usestdlib, requires, ensures, targetfpga, verify, plus the @verify Hoare-contract template with requires/ensures pre-filled
- Bracket auto-close, comment toggle, indent rules
- Static completion: keyword + builtin suggestions
- Outline view: regex-driven document symbols (fn, const, type)
What unlocks with the Forge CLI
The Forge CLI (pip install "monogate-forge[lsp]"; see
monogateforge.com/get-started) ships an LSP server and the compiler. Once installed, the extension auto-detects
both binaries on PATH and lights up:
- Real-time diagnostics — lex, parse, and chain-order errors as you type
- Hover — chain order, cost class, FPGA cycles for fns; structural class + chain delta for builtin transcendentals
- Rich completion — local decls + 87 stdlib symbols (math, ml, signal, linalg, control, constants)
- Cross-file goto-definition — into bundled stdlib + sibling user
.eml files
- Find all references + workspace-wide rename (rename blocks builtins; validates new names)
- Document symbols + outline — typed via the real parser, not regex
- Document links — ctrl-click
use stdlib::* clauses to jump to source
- Format-on-save — re-emit canonical EML in-process via the LSP
- Workspace symbol search (Ctrl+T) — fuzzy match across every indexed file
- FPGA status bar — LUT / DSP / cycle estimates per file
- Inline profile lenses — chain order + cost class above each fn header
- Compile commands for all 36 targets (palette + right-click)
Every target compiles locally, with no license or account. Some
need something in the source to emit: Verilog, SystemVerilog, VHDL
and Chisel a @target(fpga) function; SPICE, KiCad and JLCPCB
@spice_* components; Lean, Coq and Isabelle a @verify block.
JLCPCB writes its three-file bundle to <name>_jlcpcb/ beside the
source.
Without eml-lsp, the extension still runs eml-compile --profile-only on save and puts each parse, import, unit,
refinement and chain-order error on its line.
Install
- Install this extension from the VS Code marketplace.
- Open any
.eml file — syntax + snippets + outline work immediately.
- To enable real-time diagnostics, hover, completion, format, and
compile-to-anything: visit https://monogateforge.com/get-started
for the CLI.
Architecture
| File |
Role |
src/extension.ts |
Entry point — registers providers + commands |
src/forgeCli.ts |
Resolves eml-compile and eml-lsp on PATH |
src/lspClient.ts |
Spawns eml-lsp and connects vscode-languageclient |
src/editorOnly.ts |
Static completion + regex outline (no CLI needed) |
src/profileProvider.ts |
CodeLens provider — runs --profile-only, parses dashboard |
src/diagnostics.ts |
Save-triggered diagnostics fallback when LSP unavailable |
src/cliDiagnostics.ts |
Reads each error's location from eml-compile output (no vscode import) |
language-configuration.json |
Bracket auto-close, comment toggle |
syntaxes/eml.tmLanguage.json |
TextMate grammar |
snippets/eml.json |
Snippet library |
The LSP discovery happens once per session (cached). When the LSP
isn't available, the extension falls back to: static completion
provider, regex outliner, save-time diagnostics from eml-compile
when it is installed, and a one-shot install hint (no nag — appears
once per session).
| |