Language server for Avrae draconic aliases
Project description
Avrae Draconic Alias Language Server
Language Server Protocol (LSP) implementation targeting Avrae-style draconic aliases. It provides syntax/semantic diagnostics, a mocked execution command, and a thin configuration layer driven by a workspace .avraels.json file. Credit to Avrae team for all code yoinked!
Install (released package)
- CLI/server via
uv tool(preferred):uv tool install avrae-lsthenavrae-ls --helpto see stdio/TCP options (same aspython -m avrae_ls). The VS Code extension uses this invocation by default. The draconic interpreter is vendored, so no Git deps are needed.
VS Code extension (released)
- Install from VSIX: download
avrae-ls-client.vsixfrom the GitHub releases page, then in VS Code run “Extensions: Install from VSIX” and select the file. - Open your alias workspace; commands like
Avrae: Show Alias PreviewandAvrae: Run Aliaswill be available. - Files ending with
.alias-moduleare treated as full-file draconic modules under theavrae-modulelanguage id (no<drac2>tags; mock run/preview commands stay tied to.aliasfiles).
Developing locally
- Prereqs: uv and Node.js.
- Install deps:
uv sync --all-extrasthenmake vscode-deps. - Build everything locally:
make package(wheel + VSIX indist/). - Run tests/lint:
make check. - Run via uv tool from source:
uv tool install --from . avrae-ls. - Run diagnostics for a single file (stdout + stderr logs):
avrae-ls --analyze path/to/alias.txt --log-level DEBUG.
How to test
- Quick check (ruff + pytest):
make check(usesuv run ruffanduv run pytestunder the hood). - Lint only:
make lintoruv run ruff check src tests. - Tests only (with coverage):
make testoruv run pytest tests --cov=src. - CLI smoke test without installing:
uv run python -m avrae_ls --analyze path/to/alias.txt.
Alias and gvar tests
avrae-ls --run-tests [path]discovers both alias tests and gvar tests and exits non-zero on failures.- Alias tests use
.alias-testor.aliastestnext to your alias file. Each test starts with an invocation, followed by---and the expected result; you can stack multiple tests in one file by repeating this pattern (optional metadata after a second---per test).!my-alias -b example args --- expected text or numbers - Gvar tests use
.gvar-testor.gvartestnext to a sibling.gvarfile with the same stem. The test body runs after an implicitusing(...)import of that module under a sanitized local binding name.return my_module.constant --- expected value - A gvar named
foo-bar.gvaris exposed to tests asfoo_bar; a leading digit becomesgvar_<stem>. - Multi-case
.gvar-testfiles are supported. Separate cases with a second---, then a blank line before the next test body. Metadata after the second---is optional. - For embed aliases, put a YAML/JSON dictionary after the separator to compare against the embed preview (partial dictionaries are allowed).
!embedtest --- title: Hello description: World - Embed fields lists can be partial: only the listed fields (in order) are matched; extra fields in the alias do not fail the test.
- Use regex expectations by wrapping strings in
/.../(orre:...). You can also mix literals with regex segments (e.g.,Hello /world.*/) so only the delimited part is treated as regex. - Optional second
---section can carry metadata:name: critical-hit vars: cvars: hp: 12 character: name: Testernameis a label for reporting,varsare merged into cvars/uvars/svars/gvars, andcharacterkeys are deep-merged into the mock character. - Gvar tests compare the direct execution result of the test body, not alias preview/embed output.
Config variable substitution
.avraels.jsonvalues support environment variable substitution with$NAMEor${NAME}.workspaceRootandworkspaceFolderare injected automatically. Missing variables are replaced with an empty string and logged as warnings.
Runtime differences (mock vs. live Avrae)
- Mock execution never writes back to Avrae: cvar/uvar/gvar mutations only live for the current run and reset before the next.
- Network is limited to gvar fetches (when
enableGvarFetchis true) andverify_signature; other Avrae/Discord calls are replaced with mocked context data from.avraels.json. get_gvar/usingvalues are pulled from local var files first; remote fetches go tohttps://api.avrae.io/customizations/gvars/<id>(or youravraeService.baseUrl) usingavraeService.tokenand are cached for the session. In var files, a gvar can be a direct value or a{ "filePath": "relative/or/absolute/path" }object (also supports"path") that loads file contents as the gvar value.signature()returns a mock string (mock-signature:<int>).verify_signature()POSTs to/bot/signature/verify, reuses the last successful response per signature, and includesavraeService.tokenif present.
Troubleshooting gvar fetch / verify_signature
get_gvarreturnsNoneorusing(...)raisesModuleNotFoundError: ensure the workspace.avraels.jsonsetsenableGvarFetch: true, includes a validavraeService.token, or seed the gvar in a var file referenced byvarFiles(includingfilePathgvar entries).- HTTP 401/403/404 from fetch/verify calls: check the token (401/403) and the gvar/signature id (404). Override
avraeService.baseUrlif you mirror the API. - Slow or flaky calls: disable remote fetches by flipping
enableGvarFetchoff to rely purely on local vars.
Other editors (stdio)
- Any client can launch the server with stdio:
avrae-ls --stdio(flag accepted for client compatibility) orpython -m avrae_ls. The server will also auto-discover.avraels.jsonin parent folders. - Neovim (nvim-lspconfig example):
require("lspconfig").avraels.setup({ cmd = { "avrae-ls", "--stdio" }, filetypes = { "avrae" }, root_dir = require("lspconfig.util").root_pattern(".avraels.json", ".git"), })
- Emacs (lsp-mode snippet):
(lsp-register-client (make-lsp-client :new-connection (lsp-stdio-connection '("avrae-ls" "--stdio")) :major-modes '(fundamental-mode) ;; bind to your Avrae alias mode :server-id 'avrae-ls))
- VS Code commands to mirror:
Avrae: Run Alias (Mock),Avrae: Show Alias Preview,Avrae: Refresh GVARs, andAvrae: Reload Workspace Configrun against the same server binary.
Releasing (maintainers)
- Bump
pyproject.toml/package.json - Create Github release
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file avrae_ls-0.9.4.tar.gz.
File metadata
- Download URL: avrae_ls-0.9.4.tar.gz
- Upload date:
- Size: 99.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89535cd6aa856d6f6ebe8f0c8b178444301e1857979715719a45f15b76ba70f9
|
|
| MD5 |
dd873ca1903ef5f8b9834013b7be8402
|
|
| BLAKE2b-256 |
49b48d27458081bb2175e7013102e7561b180996b4d3248d108be8583976c9ed
|
File details
Details for the file avrae_ls-0.9.4-py3-none-any.whl.
File metadata
- Download URL: avrae_ls-0.9.4-py3-none-any.whl
- Upload date:
- Size: 116.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
473df2ae1fc7ed1f3bc110216ccade40dc85910730d9dd54f9d718a44843c267
|
|
| MD5 |
b407e1dfce82800af356b114b2c8ee9e
|
|
| BLAKE2b-256 |
51d67c542989c0139fbceec0d881a204767dbd3f4ffcf54d9529090b9870bda5
|