Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Changelog

0.17.0 (2026-08-20)

Breaking changes

  • parser: pair one-sided environment aliases (d757cdc), closes #117
  • parser: arity-directed expl3 attachment (#119) (5f2f9d8)

Features

  • formatter: format DTX doc environments (ac98c95), fixes #127
  • parser: intra-file incremental reparse (#130) (393e0c3)
  • bench: time the keystroke pipeline (b1b2b0e)
  • parser: pair one-sided environment aliases (d757cdc), closes #117
  • parser: arity-directed expl3 attachment (#119) (5f2f9d8)
  • formatter: wrap picture statements at TikZ unit boundaries (5079f96)
  • formatter: hang statement continuations in picture bodies (5266aba)

Bug Fixes

  • parser: isolate command definition names (8d6e274), fixes #133
  • formatter: preserve TeX line semantics (f16188b), fixes #132
  • formatter: handle mixed dtx doc regions (6edfd81), fixes #126
  • preserve dtx documentation math (de0c54c), fixes #138
  • formatter: preserve guarded dtx paragraphs (0373420), fixes #123

Performance Improvements

  • lsp: share document text and line index (3d4a5f8)

Dependencies

  • updated crates/badness-formatter to v0.4.0
  • updated crates/badness-parser to v0.3.0

0.16.0 (2026-08-14)

Features

  • config: declare environments in badness.toml (#115) (a80b5af)
  • formatter: lay out picture bodies as statements (b437091), closes #114
  • linter: add % badness-lint suppression directives (c03114d), refs #114
  • formatter: add suppression comment directives (1810cde), refs #114
  • linter: add blank-line-in-keyval (0758ea4)
  • formatter: segment a mandatory keyval group (d79ec73)
  • formatter: width-driven layout for opaque brace groups (03022a8)
  • cli: add the strict trivia-invariance check (3796d7a)
  • linter: add label-before-caption rule (e8c5b7f)
  • linter: colorize the pretty lint report (e4faf16)
  • parser: pair user-defined environment delimiters (2bbff60), closes #109
  • cli: read stdin from -, not a bare terminal (5bb4788), closes #111
  • formatter: lay conditionals out all-or-nothing (ed84bfe)
  • parser: gated CONDITIONAL node for \if…\else…\or…\fi (e0ca4ef)
  • bib: parse and preserve % comments (e005cc9)
  • skill: add formatter-fixture for construct coverage (a52095a)
  • lsp: add inverse search over IPC (3b829eb)
  • lsp: add textDocument/forwardSearch (8028a40)
  • formatter: explode sibling-attached expl3 branches (d3fc51a)
  • formatter: expand optional arguments to the width (4c28ba4)
  • formatter: add optional serde and schema features (80726c7)
  • formatter: reflow doc-margined out-of-region expl3 runs (aa9445a)
  • formatter: reflow dtx prose around margined blocks (4f118a2)
  • semantic: add curated block-level command property (c54a5ff)

Bug Fixes

  • formatter: break a keyval group’s glued opener (507a982)
  • scripts: keep pdflatex stdout off hyperref’s .out (1e7c4c1)
  • formatter: body a \begin tail past the declared arity (bd7028e)
  • parser: break every gate’s run at a docstrip guard (d682e8f)
  • formatter: guard a prose argument’s edge comments (8976815)
  • formatter: break around curated block-level commands (09b8d4f)
  • linter: pair straight quotes into one finding (e1ff0d1)
  • parser: harden environment-alias pairing (84f11a2)
  • project: link a subfile to its parent document (df3e66c), closes #112
  • lsp: spell decoded URI paths with native separators (f199bd1)
  • formatter: break around sectioning commands (f4be809)
  • formatter: stop deleting ] inside prose arguments (7d2799f)
  • formatter: make optional fallbacks deterministic (9d2095c)
  • formatter: correct what lower_conditional assumes (902dbd9)

Performance Improvements

  • cli: use Histogram for the --check diff, measured on the corpora (29a678a)
  • cli: pick Patience over Histogram for the --check diff (595abb3)
  • cli: diff --check with Histogram, write it buffered (f34abb8)
  • lint: render pretty snippets from a line window (9dffc3d)
  • parser: one batch driver for all nine shape gates (#113) (9e01ee5)
  • parser: bound the environment-alias closer scan (ae83909)
  • formatter: gate the doc-margin scans on cx.is_dtx (4e7babf)
  • parser: answer on_doc_margin_line from a pre-scan (930380b)

Dependencies

  • updated crates/badness-formatter to v0.3.0
  • updated crates/badness-parser to v0.2.0

0.15.0 (2026-08-07)

Features

  • formatter: default every file kind to reflow (ba9f2f9)
  • formatter: add a line-ending style (373a16c)
  • wasm: add badness-wasm playground shim crate (6486890)

Bug Fixes

  • formatter: hug detonating atoms in fallback fills (db63ddb)
  • formatter: accept a relation as an expl3 N slot (4a3d92b), closes #106
  • formatter: gate the expl3 forced-break dispatch in fallback lines (7437f69)
  • linter: skip parameter-template keys in key scans (928aa4a), closes #104
  • formatter: keep fitting math segments flat (903ec3e)

Dependencies

  • updated crates/badness-formatter to v0.2.0
  • updated crates/badness-parser to v0.1.1

0.14.0 (2026-08-06)

Features

  • cli: diff changed files in format --check (eed1537)
  • semantic: curate filecontents and ltxdockit verbatim envs (d805548), closes #98
  • formatter: respace flush expl3 argument braces (c44125c)
  • formatter: add trivia-perturbation invariance oracle (#103) (f22d668)
  • packaging: publish badness-bin to the AUR on release (82a64c2)
  • lint: add --output json machine-readable findings (92b04bd)
  • formatter: explode expl3 conditional branches (R4) (bebdbde)
  • parser: recognize package-defined verbatim envs (696f109)
  • build: bundle man pages and completion in tarballs (8268c88)

Bug Fixes

  • formatter: render expl3 conditionals all-or-nothing (c8b3aef)
  • formatter: keep annotated expl3 branches on the exploded path (ac07506), refs #101
  • formatter: drop expl3 sibling break coupling (836ed83), closes #101
  • packaging: tolerate pre-0.14 release tarballs in PKGBUILD (750493b)
  • installer: detect musl/libc in installation script (eb195a1)
  • formatter: pin forced expl3 block body to break mode (349ccdd)
  • formatter: stabilize trailing expl3 hang group (72a6d35), closes #96
  • npm: fall back to musl when glibc build fails (bd1891e)
  • formatter: stabilize trailing expl3 conditional (b5ed902), refs #96
  • parser: pair \left/\right inside macro code (20a59ef), closes #95
  • parser: bound math bracket gate at dollar closer (703f5f5), closes #99
  • formatter: keep expl3 parameter runs tight (47d6277), exception #1 and #2
  • formatter: sticky-break fill for expl3 statements (107ecb0), closes #94
  • linter: stop TikZ/pgf false positives (aca172f)
  • linter: drop “Part”, gate hard-coded-reference item labels (274c124)
  • linter: gate space-before-command on trailing break (2f66cae)
  • linter: skip hex constants, font maps in straight-quotes (2fb9ee3)
  • linter: skip redefined commands in deprecated/primitive (0490f16)
  • linter: skip starred headings in sectioning-level-jump (befe30e)
  • parser: parse array and tikzcd bodies as math (9db4e8f)

0.13.0 (2026-08-01)

Features

  • semantic: curate codeexample as verbatim env (4fb98f7)
  • lexer: infer expl3 in toggle-less .dtx (caba767)
  • lsp: link package docs via texdoc in hover (40b2665)
  • lsp: filter cite completion by title and author (509cd4a)
  • linter: express and apply cross-file fixes (e9071f8)
  • vscode: add feature toggles for the LSP (bb3f13c), closes #86
  • formatter: align user environments on & (ee88953), closes #84
  • formatter: hang expl3 attached brace arguments (c25c91b)
  • formatter: hang \item continuations under preserve (5edeea7), closes #82
  • incremental: mark SourceFile.path HIGH durability (bca096a)
  • linter: flag unclosed math delimiters as likely typos (4731c18)

Bug Fixes

  • parser: parse .code.tex under package flavor (2694a86)
  • linter: withhold deprecated-command fix in reference position (668647a)
  • linter: skip compound-logo swallowed space (0a546b7)
  • linter: ignore \string-prefixed package loads (e20504e)
  • linter: skip \texttt dashes and \foreach ranges (f605ee5)
  • linter: skip citation locators and env titles in hard-coded-reference (620bde5)
  • linter: skip xypic @ DSL in makeat-macro (81e4c81)
  • parser: attach math optional across balanced $...$ (b5c6c50)
  • formatter: scope preserve spacing collapse to prose (0999610)
  • formatter: normalize inner spacing under preserve (be8d5ba)
  • linter: skip prose rules in Lua code and doc placeholders (bcd4f44)

Performance Improvements

  • line-index: precompute wide-char table, own no text (d9c526f)

0.12.0 (2026-07-30)

Features

  • formatter: break leading \label onto its own line (18b17c5)
  • add stable-diff paragraph wrapping (#41) (5734632)
  • format: indent expl3 continuation groups one step (d53f064)
  • config: add BADNESS_CONFIG env var for config path (b8756e8)
  • cli: add hidden debug format check command (da5959f)
  • config: add global user config fallback (41c4570), closes #40
  • formatter: add math-wrap display-math break policy (dbba5eb), closes #42

Bug Fixes

  • formatter: pin inter-argument docstrip guards to column 0 (3556c79), closes #78
  • formatter: keep stable-wrap break mask aligned on Nil atoms (d4211b1)
  • parser: shape-gate unclosed \left instead of erroring (29aa319), closes #77
  • parser: close the latex2e format-error buckets from the smoke test (#80) (bb9484e)
  • parser: stop the lexer hiding braces, guards, and short-verb bars (#79) (a6e2119), refs #71
  • parser: stop environments escaping their brace group (#75) (7d82f35), refs #71
  • parser: scope the math gates’ paragraph-break anchor to the body’s own level (#74) (ef89b76), closes #70
  • gate expl3 relayout to top-level toggles (81a1a92), closes #69
  • parser: suppress braced verbatim on redefinition (513e963)
  • formatter: preserve fully-guarded expl3 chunks (5d2e46b), closes #72
  • parser: treat escaped backtick char constant as data (d7edf4b), refs #71
  • format: keep glued brace opener on its line (97e7abb)
  • format: treat sign after opener as unary in math (94af6dd)
  • format: keep guarded expl3 code groups broken (417c480), closes #61
  • format: keep doc-margin math environments verbatim (d8e3864), refs #61
  • format: make trailing comments zero-width in expl3 code (db53fc8)
  • format: keep doc-commented expl3 statements whole (fb61e15)
  • parser: treat expl3 regions and v-arg names as macro data (e9deecf), issue #60
  • parser: add ^^A, v-arg, and char-constant lexing (ff2b516)
  • parser: gate \[/\( and isolate \def-family names (bb55149), closes #65
  • lexer: accept comment tail on macrocode end frame (fa01c29), closes #62
  • parser: gate \begin/\end on a name-shaped group (0dfeb0b)
  • parser: gate text-mode brackets on a reachable closer (47f92f9), refs #60
  • lexer: add l3doc to curated doc classes (e34cd7f)
  • parser: gate dollar math on a reachable closer (4a01a6b)
  • formatter: feed run-final trivia to expl3 run separator (ad2ce81), closes #58
  • formatter: own only macrocode bodies in dtx expl3 regions (d0abf21)
  • formatter: refine expl3 group style in regions (1cda543), refs #57
  • parse doc short verbs and chunked dtx macro code (37fbf9c), refs #57
  • formatter: strip script braces before operator atoms (d627794), closes #56
  • parser: count nested optionals in math bracket gate (7b98255), closes #55
  • parser: widen definition bodies to hooks and \newcommand (ab7d809)
  • formatter: keep trailing comments riding their line (71baa30), closes #54
  • parser: make verb delimiter capture opt-in (4788af9), closes #53
  • formatter: keep own-line comments in list bodies (f468619), closes #48
  • formatter: keep grid indent on doc-commented rules (e0ccee0), closes #49
  • formatter: collapse fitting multi-line optional args (cf15d18), closes #47
  • formatter: lift \begin-line % in every env layout (9c7fe0e), closes #38
  • parser: accept split \begin/\end in env definitions (e4f711d), closes #45
  • parser: stop math brackets parsing as optional args (0eb49d5), closes #43
  • formatter: improve display-math break-point detection (9e97826), refs #42
  • formatter: keep multi-line math LHS off the relation column (b7fd62b), closes #39
  • formatter: keep trailing % glued to a block segment (5369c22), closes #38
  • vscode: swap npm-run-all for npm-run-all2 (b631714)

0.11.0 (2026-07-20)

Breaking changes

  • lsp: move texmf config to editor settings (2f83a84)

Features

  • lsp: move texmf config to editor settings (2f83a84)
  • formatter: hang nested blocks in align grids (5103bab)
  • linter: document bib rules in –explain and docs (a2a742c), closes #24

Bug Fixes

  • tests: adapt to lsp-server 0.10 Response API (5f1e889)
  • linter: skip script labels inside argument groups (1f8c0eb), closes #37
  • parser: name blank line as math terminator (2751787), ref #35
  • linter: ignore key arguments in dash-length (506e5f0)
  • linter: ignore rule-command spans in dash-length (adeecf6), closes #34
  • linter: ignore key arguments in math-shape rules (387810a), closes #25
  • parser: keep unmatched [ a plain atom in math (c185c13), closes #23
  • linter: ignore labels in exclusive conditional branches (a6e0c22)
  • linter: ignore package loads in exclusive branches (d16d3d1), closes #27
  • linter: target the whole construct for DOC_COMMENT-bound suppressions (cd647fa), fixes #26

0.10.0 (2026-07-15)

Features

  • add --force-exclude to format and lint (05c8e32)

0.9.0 (2026-07-14)

Features

  • linter: make fixes carry multiple atomic edits (7f52ef5)
  • linter: add diagnostic related information (ada447b)
  • parser: add a release-mode stuck-loop step limiter (f93b1e5)
  • lsp: add diagnostic tags and rule doc links (906b0df)

Bug Fixes

  • lsp: recover poisoned db mutexes instead of panicking (5844ff2)
  • bib: resolve field aliases in missing-required check (f20283b)

0.8.0 (2026-07-11)

Features

  • lsp: show source package in macro hover (eaf030e)
  • lint: add unknown-option rule for local packages (f040033)
  • bib: document links for doi and url fields (e1f15f7)
  • completion: argument-value enum completion (f363499)
  • bench: add linter speed benchmark vs lacheck and chktex (e6a821e)
  • bench: add whole-project folder benchmark (620c7cc)
  • bib: typed AST wrapper layer for BibTeX CST (0abe33a)
  • ast: typed AstNode/AstToken wrapper layer (35eae44)

Performance Improvements

  • cli: parallelize lint –fix across files (133a4c3)

0.7.0 (2026-07-08)

Features

  • lsp: selection ranges from CST hierarchy (2aff55f)
  • formatter: column-spec-aware table alignment (9ab94ba)
  • linter: package-aware duplicate and provides lints (758fac3)
  • semantic: recognize package metadata and options (0cd95ce)
  • lsp: color and TikZ/PGF library completion (1a881f3)
  • lint: add unreferenced-label rule (4d975a1)
  • lint: add verbatim-trailing-text rule (a11358d)
  • lint: flag line-break tie in missing-nonbreaking-space (de2d51f)
  • lint: autofix obsolete-environment eqnarray to align (aa26b13)
  • lint: add missing-required-argument rule (5206ee6)
  • lsp: references, rename, goto-def for user macros (fdeb0e9)
  • lsp: negotiate client capabilities at initialize (36b6ed2)
  • lsp: change-environment refactor command (1f27fab)
  • lsp: glossary/acronym key completion (f73f138)
  • lsp: signature help for command arguments (0c5f649)
  • lsp: label hover and symbol numbers from .aux (3efb7aa)
  • semantic: classify what a \label labels (01a8b0b)
  • project: scan .aux for label numbers and toc (ed48898)
  • config: add [build] section with aux-dir (ad8cc8a)
  • lsp: go-to-definition for include/package file arguments (99927ea)
  • lsp: resolve packages via TEXMF index and CTAN metadata (24ba5c7)

Bug Fixes

  • bib: tighten title-capitalization camelCase heuristic (91de065)
  • ci: rename aux.rs, allow option-ext MPL-2.0 (cc1c834)

Performance Improvements

  • formatter: parallelize the CLI format paths (d38b4d6)
  • linter: cache registry, stream rewalkers, parallelize CLI (5c3813a)
  • signature: bake CTAN metadata via phf, not runtime parse (f635d23)

0.6.0 (2026-07-06)

Features

  • completion: complete \usepackage/\documentclass names (2457147)
  • completion: add baked package/class name lists (ff4906d)
  • lsp: add document links (915aea6)
  • lsp: highlight matching \begin/\end pair (d643518)
  • lsp: re-indent on close via onTypeFormatting (5972340)
  • parser: parse math environments in math mode (9097be3)
  • formatter: implement sentence and semantic wrap modes (17003ba)
  • linter: add hard-coded-reference rule (da66c29)
  • linter: add sectioning-level-jump rule (6ac6def)
  • linter: add makeat-macro rule (2ae6d07)
  • linter: add space-before-command rule (36d5fa3)
  • linter: add abbreviation-spacing rule (2fea8db)
  • linter: add swallowed-space rule (c48aa20)
  • linter: add primitive-command rule (94da7ca)
  • linter: add math-operator-name rule (17cc5f2)
  • linter: add times-variable rule (52de07a)
  • linter: add dash-length rule (a6218e0)
  • linter: add straight-quotes rule for ASCII quotes (adff4ba)
  • linter: add ellipsis rule for literal … (488ebdd)
  • linter: generate rules reference from metadata (74e2234)
  • math: normalize operator spacing (36c9314)
  • semantic: keep built-in over delegating arity-0 redef (9fd50d8)
  • add title, author, date, thanks to signatures db (3c537d1)
  • formatter: stack binary chains under the relation too (0777920)
  • formatter: align relation chains in display math (e69a72e)
  • formatter: join alignment-cell continuation lines (cd3e590)
  • semantic: resolve packages to .dtx sources (249e68e)

Bug Fixes

  • parser: point unclosed-delimiter errors at the opener (1029351)
  • formatter: tight spacing and no paren breaks in display math (7112b8c)
  • linter: allow en dash between proper names in dash-length (2ab4342)
  • formatter: peel over-attached cell off table rules (7c91ac9)

Reverts

  • “feat(formatter): stack binary chains under the relation too” (4a6988b)

0.5.0 (2026-07-01)

Features

  • lsp: add range formatting support (5ad2827)
  • lsp: add workspace symbols support (eb8a111)
  • formatter: format expl3 code (catcode 9/10 model) (ac4ff31)
  • lsp: watch on-disk tex/bib/config and reanalyze (b551c01)
  • dtx: reflow documentation prose under reflow (be57646)
  • lsp: outline entries for dtx documented macros (cba0b01)
  • lsp: add textDocument/documentHighlight (404069b)
  • bench: add formatter speed bench vs tex-fmt & latexindent (82ddeb5)
  • format: reflow brace-group bodies as statements (bb976e0)
  • lsp: discover and apply badness.toml per document (e56a8af)
  • lint: add missing-nonbreaking-space (tie before cite/ref) (4d75da4)
  • lsp: surface linter autofixes as code actions (13c727e)
  • lsp: resolve completion items with signature and citation detail (f9892e6)
  • lsp: add hover for commands, environments and citations (3c6047c)
  • lsp: add pull diagnostics (a73fd7b)

Bug Fixes

  • lsp: honor excludes for siblings (7a50529)

Performance Improvements

  • signature: bake CWL tier into a build-time phf map (a920d4a)

0.4.0 (2026-06-23)

Features

  • semantic: mark the cross-reference family inline (c7c77a7)
  • semantic: ingest CWL corpus as a bulk signature tier (4740bf5)
  • lint: don’t withold lints that disturbs alignment (8ea1efc)
  • bib: diagnose missing field separator; fix value trivia attachment (e14751c)
  • bib: autofix duplicate-field when values are identical (c34bd78)
  • bib: duplicate-field lint rule (f2f6d60)
  • lsp: rename labels and citation keys (textDocument/rename + prepareRename) (7b1d01b)
  • config: badness.toml configuration (CLI) (8c68ca2)
  • project: package load graph + package signatures into scope (f8e6bc7)
  • semantic: doc/ltxdoc prose↔code association query (a52f17c)
  • file-kind: .ins installation-script support (plain code, Preserve) (85c9c7a)
  • formatter: .dtx two-layer formatting (foundation, Preserve) (6c7861f)
  • semantic: doc/ltxdoc signatures + DOC_COMMENT node (M3) (95ec2a2)
  • parser: lex expl3 syntax mode (_/: as letters) (c98e2e8)
  • parser: lex .dtx docstrip guards as GUARD tokens (M2) (b09c507)
  • parser: parse .dtx docstrip surface syntax (M0+M1) (8e54604)
  • lsp: add textDocument/foldingRange (f0ea513)

Bug Fixes

  • cli: fix file-detection in cli linter (7821b6a)

0.3.0 (2026-06-21)

Features

  • lsp: add textDocument/references (find references) (2ef3606)
  • sty/cls: format and lint LaTeX package/class sources (54692cf)
  • lsp: bib-aware completion and \cite key completion (493ad41)
  • bib: add generator to sync bib_fields.json with biblatex data model (189de08)
  • bib: align entry-type required fields to the data model (35b81d9)
  • bib: derive field/entry DB from biblatex’s canonical data model (55a6883)
  • bib: recognize the full standard biblatex field set (e2c2639)
  • semantic: flag user verbatim environments via begin-code catcode scanning (eefc1a1)
  • semantic: scan \def-defined verbatim commands and helper chains (6cad9c1)
  • semantic: flag user verbatim-argument commands via definition scanning (19ef5f1)
  • lsp: go-to-definition for refs and citations (2535199)
  • cli: –stdin-filepath routes lint stdin to the bib pipeline (f8a4831)
  • cli: –stdin-filepath routes format stdin to the bib pipeline (96f1b80)
  • lsp: cross-file project assembly — undefined-ref/citation fire live (38b7f2c)
  • bib: Phase 4 — incremental, LSP, and project-graph integration (b593bdc)
  • bib: linter rules + CLI wiring (Phase 3) (571c2d3)
  • bib: field & entry sorting (Phase 2c) (438a61d)
  • bib: value reflow (Phase 2b) — wrap long field values by category (3cfed27)
  • bib: formatter (Phase 2) — lower bib CST to shared Wadler IR (de48afd)
  • bib: semantic model + field/entry signature DB (b59befc)
  • bib: differential parse oracle vs texlab + phased roadmap (d7360b6)
  • bib: first-stab BibTeX/BibLaTeX parser (6f38675)
  • lsp: add basic completion (20903b7)
  • linter: autofix infra + dollar-display-math $$→[ fix (216f590)
  • linter: obsolete-environment, dollar-display-math, mismatched-delimiter lints (8f89b51)
  • formatter: break wide display math at top-level operators (716612f)
  • linter: cross-file label resolution + undefined-ref / duplicate-label (270a035)
  • formatter: keep appendix environment body flush like document (b1a55f7)
  • formatter: collapse cite-family key lists deterministically (d88e7e3)
  • semantic: extract unbraced \newcommand\foo definition form (f2472d5)
  • parser: bind leading comments into the following construct (0afabeb)
  • lsp: add document symbols (5547650)
  • parser: don’t wrap a lone block environment in a PARAGRAPH (b4a46fe)
  • formatter: use latexindent-style desc hang (46ab231)
  • formatter: reflow inline prose commands inline, not as blocks (5d706b2)
  • collapse blanklines into 1 (b19d8da)
  • formatter: grid-align comments and rule lines; enable tables (4cbb183)
  • formatter: lower display math as an indented block (5e2cefc)
  • parser: lex verbatim-argument commands; fix multi-line VERB formatting (73cf04c)
  • cli: add badness parse command (7735a75)
  • formatter: align itemize blocks (47a2b19)
  • formatter: don’t indent document environment (3cd0d04)
  • linter: add rule layer with duplicate-label and deprecated-command (4aaee37)
  • align & columns in align/matrix environments (d5abdca)
  • match \left … \right delimiter pairs in math (3079875)
  • add structured math model and math formatting (02802f6)
  • support argument-taking verbatim environments (ab8eb74)
  • add file-walk for formatter (1603230)

Bug Fixes

  • lsp: handle Windows file URIs in path completion (5b38f45)
  • formatter: keep a trailing % on the \begin header line (e02413f)
  • formatter: ass JSS/Sweave verbatim environments to signatures (21b5e61)
  • don’t reflow single % (be49170)
  • formatter: don’t push % to next line (de271ae)
  • formatter: fall back when an alignment cell contains a comment (918c592)
  • parser: don’t treat comment-only lines as paragraph breaks (3c83c01)
  • formatter: keep command-only lines on their own line under reflow (739a32f)
  • linter: migrate render.rs to annotate-snippets 0.12 API (602d835)

0.2.0 (2026-06-12)

Features

  • add vscode and open vsx extensions (975f1e4)
  • npm: package for npm (b3a576f)

0.1.0 (2026-06-12)

Breaking changes

Features

  • formatter: reflow signature-marked prose arguments (18c99ee)
  • lsp: ra-style writer/threadpool, cancellation, incremental sync (8628f92)
  • lsp: reuse cached salsa tree for formatting (30cd2d5)
  • implement semantic group scanning (4f5e9ca)
  • parser: model \ line break as a LINE_BREAK node (651e1c5)
  • formatter: paragraph reflow via a Wadler Fill node (0cbe264)
  • semantic: add built-in signature database (e9bf2de)
  • rename fmt to format (1fedc1b)
  • linter: add minimal badness lint command (443fa6a)
  • lsp: add minimal lsp server (7e6f4fe)
  • formatter: indent multi-line group/argument bodies (5e66038)
  • parser: differential parse oracle vs texlab (25e065c)
  • lsp: add semantic model and reference support (61707c1)
  • build project graph (cc81a29)
  • incremental: salsa harness for cached parsing (67a1948)
  • formatter: environment-body indentation (5b3d1b5)
  • formatter: whitespace normalization (first real rule) (00385eb)
  • formatter: Phase 2 formatter MVP — identity round-trip (ab2ef57)
  • parser: Phase 1 recursive-descent grammar with error recovery (511352c)

Bug Fixes

  • attach arguments to environment (a6772d2)
  • parser: stop $-math at group and \end anchors (1319fd8)