tensr docs

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 | sh

Everything 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.vsix

It 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.