Editors
The workoutmd binary is also a language server: workoutmd lsp speaks LSP over stdio, so.workout.md gets live diagnostics, catalog-backed movement-name completion (with unknown-movement warnings), enum completion, structural snippets, lint quick-fixes, and hover — in every editor below. One offline binary; the editor just spawns it.
Install the binary
curl -fsSL https://dl.tensr.fitness/install.sh | shEverything below assumes workoutmd is on your PATH. By default the server uses an embedded seed catalog; point it at the full 911-movement bundle with --catalog <bundle.json> if you have it.
VS Code
A thin launcher extension lives in the repo ateditors/vscode/. Until it's on the Marketplace, install it from source:
cd editors/vscode
npm install
npm install -g @vscode/vsce
vsce package # → workoutmd-0.1.0.vsix
code --install-extension workoutmd-0.1.0.vsixIt also wires a jsonValidation contribution so*.workout.json validates against the published schema automatically. Settings: workoutmd.path (binary location) andworkoutmd.catalog (optional full bundle).
Neovim
Built-in LSP, no plugin needed:
vim.filetype.add({ pattern = { ['.*%.workout%.md'] = 'workoutmd' } })
vim.api.nvim_create_autocmd('FileType', {
pattern = 'workoutmd',
callback = function()
vim.lsp.start({
name = 'workoutmd',
cmd = { 'workoutmd', 'lsp' },
root_dir = vim.fs.dirname(vim.api.nvim_buf_get_name(0)),
})
end,
})Zed
In settings.json, register the server and map the language (Zed resolves the binary from your PATH):
{
"lsp": {
"workoutmd": { "binary": { "path": "workoutmd", "arguments": ["lsp"] } }
}
}Helix
In ~/.config/helix/languages.toml:
[language-server.workoutmd]
command = "workoutmd"
args = ["lsp"]
[[language]]
name = "workoutmd"
scope = "source.workoutmd"
file-types = [{ glob = "*.workout.md" }]
language-servers = ["workoutmd"]Emacs (eglot)
(add-to-list 'auto-mode-alist '("\\.workout\\.md\\'" . markdown-mode))
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs
'(markdown-mode . ("workoutmd" "lsp"))))Zero-config: .workout.json in any editor
The published schema self-references its $id, so any JSON-Schema-aware editor validates and completes.workout.json with no language server at all. In VS Code, add to settings.json:
{
"json.schemas": [
{ "fileMatch": ["*.workout.json"], "url": "https://schema.tensr.fitness/workout/v1" }
]
}Or emit the JSON with a "$schema" field — the CLI already does — and editors resolve it directly. The language server adds the one thing a static schema can't: catalog-aware movement-name completion.