0.17.0 (2026-08-20)
- parser: pair one-sided environment aliases (
d757cdc), closes #117
- parser: arity-directed expl3 attachment (#119) (
5f2f9d8)
- 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)
- 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
- lsp: share document text and line index (
3d4a5f8)
- updated crates/badness-formatter to v0.4.0
- updated crates/badness-parser to v0.3.0
0.16.0 (2026-08-14)
- 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)
- 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)
- 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)
- updated crates/badness-formatter to v0.3.0
- updated crates/badness-parser to v0.2.0
0.15.0 (2026-08-07)
- formatter: default every file kind to reflow (
ba9f2f9)
- formatter: add a line-ending style (
373a16c)
- wasm: add
badness-wasm playground shim crate (6486890)
- 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)
- updated crates/badness-formatter to v0.2.0
- updated crates/badness-parser to v0.1.1
0.14.0 (2026-08-06)
- 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)
- 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)
- 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)
- 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)
- line-index: precompute wide-char table, own no text (
d9c526f)
0.12.0 (2026-07-30)
- 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
- 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)
- lsp: move texmf config to editor settings (
2f83a84)
- 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
- 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)
- add
--force-exclude to format and lint (05c8e32)
0.9.0 (2026-07-14)
- 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)
- lsp: recover poisoned db mutexes instead of panicking (
5844ff2)
- bib: resolve field aliases in missing-required check (
f20283b)
0.8.0 (2026-07-11)
- 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)
- cli: parallelize lint –fix across files (
133a4c3)
0.7.0 (2026-07-08)
- 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)
- bib: tighten title-capitalization camelCase heuristic (
91de065)
- ci: rename aux.rs, allow option-ext MPL-2.0 (
cc1c834)
- 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)
- 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)
- 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)
- “feat(formatter): stack binary chains under the relation too” (
4a6988b)
0.5.0 (2026-07-01)
- 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)
- lsp: honor excludes for siblings (
7a50529)
- signature: bake CWL tier into a build-time phf map (
a920d4a)
0.4.0 (2026-06-23)
- 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)
- cli: fix file-detection in cli linter (
7821b6a)
0.3.0 (2026-06-21)
- 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)
- 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)
- add vscode and open vsx extensions (
975f1e4)
- npm: package for npm (
b3a576f)
0.1.0 (2026-06-12)
- 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)
- attach arguments to environment (
a6772d2)
- parser: stop $-math at group and \end anchors (
1319fd8)