Changelog

Auto-generated by cocogitto from conventional commits.

Changelog

All notable changes to this project will be documented in this file. See conventional commits for commit guidelines.


Unreleased (main)


v0.11.6 - 2026-09-20

Bug Fixes

  • leftover wrap-created RST section adornment skip-cut (snapper-7xd3)

  • leftover type-6 void HTML (hr/col/link/base) does not swallow following prose (snapper-56tj)

  • leftover RST include/raw/literalinclude same-line hang

  • leftover wrap-created org/md markers and extra-compact DL hang

  • site 404 page instead of the landing page


v0.11.5 - 2026-09-15

Bug Fixes

  • leftover native-parser walkers vs Docutils pulldown org-element and TeX (#482)


v0.11.4 - 2026-09-13

Bug Fixes

  • (latex) tokenize leftover moreverb listingcont as one walker (#477)

  • (latex) tokenize leftover fancyvrb DefineShortVerb as one walker (#474)

  • (latex) tokenize leftover moreverb verbatimwrite as one walker (#472)

  • (latex) tokenize leftover fvextra buffer cmds as one walker (#469)

  • (latex) tokenize leftover moreverb verbatimtabinput as one walker (#466)

  • (latex) tokenize leftover CatchFileDef CatchFileEdef as one walker (#464)


v0.11.3 - 2026-09-13

Bug Fixes

  • (org) do not slice #+CAPTION prefix inside a UTF-8 char (#460)

  • (latex) tokenize leftover UseVerb Verb EscVerb as one walker (#458)

  • (latex) tokenize leftover verb-span cmds as one walker (#456)

  • (latex) tokenize scontents leftover cmds as one walker (#455)

  • (latex) tokenize pythonhighlight leftover pyth as one walker (#454)

  • (latex) tokenize pythontex leftover pythontexcustomc as one walker (#453)

  • (latex) tokenize sagetex leftover inline cmds as one walker (#448)

  • (latex) tokenize pythontex usefamily leftover inlines as one walker (#447)

  • (latex) tokenize pythonhighlight leftover file-input as one walker (#444)

  • (latex) tokenize pythontex leftover inline cmds as one walker (#442)

  • (latex) tokenize leftover filename-input cmds as one walker (#440)

  • (latex) tokenize scontents inputsc like lstinputlisting (#437) (#438)

  • (rst) hang and split same-line meta field body (#434) (#435)

  • (latex) tokenize pythontex inputpylab inputsympy like inputpy (#436)

  • (rst) hang and split same-line line-block body (#432)

  • (latex) tokenize sagetex sageinput like lstinputlisting (#428) (#431)

  • (rst) hang and split same-line parsed-literal body (#426) (#429)

  • (latex) tokenize moreverb listinginput like lstinputlisting (#427)

  • (rst) hang and split same-line header footer body (#422) (#425)

  • (latex) tokenize pythontex inputpy like lstinputlisting (#419) (#423)

  • (rst) hang and split same-line substitution replace body (#417) (#421)

  • (org) leftover object-lex steals src_ after word-underscore (#420)

  • (latex) tokenize piton PitonInputFile like lstinputlisting (#418)

  • (latex) tokenize tcolorbox tcbinputlisting like lstinputlisting (#401)

  • (md) treat footnote definition body as leftover prose (#415)

  • (rst) do not swallow flush prose after line-block (#409) (#414)

  • (latex) tokenize fancyvrb VerbatimInput like lstinputlisting (#403)

  • (latex) tokenize verbatim verbatiminput like lstinputlisting (#402)

  • (latex) tokenize minted inputminted like mintinline (#397)

  • (org) treat verse-block body as leftover structure (#395) (#396)

  • (latex) tokenize listings lstinputlisting like lstinline (#393)

  • (rst) hang and reflow parsed-literal bodies (#392)

  • (latex) treat luacode leftover luaexec as code (#390)

  • (rst) hang leftover container directive bodies (#389)

  • (latex) treat pythontex option-family envs as code (#388)

  • (latex) treat sverb leftover write and demo envs as code (#387)

  • (rst) hang and split same-line note body after :: (#349) (#384)

  • (sentence) do not split markup closers inside an open quote (#374) (#383)

  • (latex) treat codehigh leftover envs as code (#382)

  • (latex) treat luamplib mplibcode as code (#381)

  • (rst) treat unmatched simple-table top as structure (#347) (#380)

  • (md) keep mid-paragraph link-reference definitions in prose (#357) (#379)

  • (org) treat unmatched begin blocks as paragraphs (#355) (#378)

  • (latex) treat pyluatex pythonq and pythonrepl as code (#377)

  • (rst) do not swallow flush prose after compact note (#344) (#376)

  • (md) end closed type-7 HTML blocks at the matching close (#373)

  • (latex) treat showexpl LTXexample as code (#375)

  • (org) keep export-snippet trailing prose and Emacs backends (#354) (#372)

  • (rst) treat lone .. as empty comment not section underline (#343) (#371)

  • (latex) treat texments/pygmentex pygmented as code (#342) (#370)

  • (md) do not join unquoted prose onto quoted HTML blocks (#369)

  • (rst) treat interior-colon field names as field markers (#368)

  • (md) treat quoted empty list markers as Structure (#339) (#367)

  • (org) keep brace subscript wrap atomic across interior punct (#366)

  • (org) keep latex-fragments atomic across interior punctuation (#365)

  • (org) keep angular links atomic across interior punctuation (#335) (#364)

  • (md) treat padded empty CommonMark list markers as Structure (#337) (#363)

  • (latex) treat leftover tcolorbox write and listing envs as code (#362)

  • (md) end closed type-6 HTML blocks at the matching close (#332) (#360)

  • (latex) treat leftover pythontex default-family envs as code (#361)

  • (rst) treat empty doctest opener as Structure (#331) (#359)

  • (rst) treat empty field-list markers at EOL as Structure (#330) (#358)

  • (md) treat empty CommonMark list markers as Structure (#326) (#329)

  • (md) treat empty ATX headings as Structure (#327) (#328)

  • (rst) treat empty and unicode Docutils bullets as Structure (#324) (#325)

  • (org) treat empty list bullets at EOL as Structure (#320) (#323)

  • (org) treat Emacs word-char drawer names as structure (#318) (#322)

  • (org) treat mixed-case planning and clock as Structure (#321)

  • (latex) treat verbments pyglist as code (#316)

  • (org) treat table-rule lines as structure (#310) (#317)

  • (org) treat column-0 diary-sexp as Structure (#315)

  • (latex) treat pythonhighlight python as code (#314)

  • (latex) treat piton.sty Piton env and piton pipe as code (#312)

  • (latex) treat moreverb verbatimwrite as code (#313)

  • (latex) treat scontents and verbatimsc as code (#311)

v0.11.2 - 2026-09-11

Bug Fixes

  • (latex) treat sagetex sageverbatim family as code (#301)

  • (latex) treat filecontentsdef leftover sibling envs as code (#300)

  • (latex) treat fvextra VerbatimBuffer as code (#296)

  • (latex) treat fvextra VerbEnv as code (#293) (#297)

  • (latex) treat filecontentsdef env as code (#295)

  • (latex) treat tcolorbox verbatim write envs as code (#290)

  • (latex) treat pythontex pylab envs as verbatim (#278) (#289)

  • (latex) treat moreverb listing envs as code (#288)

  • (latex) treat pythontex sympy envs as verbatim (#277) (#287)

  • (latex) treat pythontex starred py envs as verbatim (#276) (#286)

  • (latex) treat minted-star env as code (#284)

  • (latex) tokenize fancyvrb SaveVerb like Verb (#275) (#283)

  • (latex) treat pythontex pygments env as verbatim (#282)

  • (latex) treat pythontex pyblock pyverbatim pyconsole as code (#257)

  • (latex) treat moreverb verbatimtab as code (#256)

  • (latex) treat fvextra VerbatimWrite as code (#255)

  • (latex) treat tcolorbox tcblisting-star as code (#254)

  • (latex) tokenize fancyvrb Verb and Verb* like verb (#253)

  • (latex) tokenize minted mintinline and mint like lstinline (#252)

  • (latex) treat fancyvrb Verbatim-star envs as code (#251)

  • (latex) treat spverbatim and spverb as verbatim (#242)

  • (latex) treat listings lstlisting* as code (#238)

  • (latex) treat alltt as code so listing bodies do not reflow as prose (#236)

  • (latex) treat fancyvrb SaveVerbatim and VerbatimOut as code (#224)

  • (latex) treat fancyvrb BVerbatim and LVerbatim as code (#223)

  • (latex) treat IEEEeqnarray xltabular and math-star as structure (#187)

  • (latex) treat NiceTabular listabla and spreadtab as structure (#188)

  • (latex) reflow figure and table caption long arguments (#156)

  • (latex) treat tikzcd axis and pgfpicture as structure (#152)

  • (latex) treat optional section short title as Structure (#150)

  • (latex) treat Verbatim boxedverbatim and tcblisting as code (#147)

  • (latex) treat mid-line display math opener as Structure (#124)

  • (latex) keep comment env and iffalse as raw (#116)

  • (latex) treat dollar-dollar display math as Structure (#115)

  • (latex) treat tree-sitter and latexindent math/table envs as structure (#114)

  • (latex) treat filecontents and trivia envs as code (#113)

  • (latex) hang enumerate item continuation sentences (#78)

  • (markdown) treat dest-on-next-line link references as Structure (#202)

  • (markdown) treat link-reference and footnote definitions as Structure (#190)

  • (markdown) treat 0-3 space ATX headings as Structure (#189)

  • (markdown) treat CommonMark > with optional space as a quote (#155)

  • (markdown) treat CommonMark thematic breaks as Structure (#149)

  • (markdown) keep GFM tables without flanking pipes as structure (#140)

  • (markdown) keep list items open across blank indent (#137)

  • (markdown) treat $$ display math as Structure (#123)

  • (markdown) treat CommonMark HTML blocks as Structure (#122)

  • (markdown) treat CommonMark indented code as Code (#121)

  • (markdown) treat quoted fences as Code (#119)

  • (md) treat ordered start != 1 as setext title text (#271)

  • (md) reject list setext underlines shallower than the open item hang (#270)

  • (md) count every quote marker so matching > > setext promotes (#269)

  • (md) do not treat 4-space > - as a quoted list opener (#268)

  • (md) count nested quote markers after 0-3 spaces (#267)

  • (md) reject list setext underlines shallower than the item hang (#265)

  • (md) promote only the open paragraph for setext titles (#228)

  • (md) keep definition list terms and : markers as structure (#225)

  • (md) keep GFM alert type markers as structure (#222)

  • (md) close YAML front matter on … and keep blank — as a break (#217)

  • (md) cap ordered list markers at 9 digits (#191)

  • (md) keep same-line 0. A. opener with its sentence (#184)

  • (md) keep sentence break after punct inside link tails (#201)

  • (org) keep two-sentence verse lines as one physical line (#285)

  • (org) keep timestamps atomic across interior punctuation (#264)

  • (org) keep inline src_ and call_ atomic (#240)

  • (org) treat \ at EOL as an org-element line break (#239)

  • (org) keep inline footnote references atomic (#237)

  • (org) keep macros atomic across interior punctuation (#229)

  • (org) keep radio and angle targets atomic (#226)

  • (org) hang and reflow #+CAPTION values (#221)

  • (org) treat footnote definitions as hung prose (#199)

  • (org) reflow special-block interiors as prose (#197)

  • (org) stop file: token swallowing sentence punct (#185)

  • (org) treat #+BEGIN: dynamic blocks as Structure (#178) (#195)

  • (org) require space or EOL after hash comments (#194)

  • (org) treat [cite…] as an atomic inline token (#153)

  • (org) treat indented star lists as list items (#148)

  • (org) treat planning and clock lines as Structure (#145)

  • (org) classify same-line display math and latex env (#141)

  • (org) treat quote/verse/center as structure plus inner prose (#139)

  • (org) classify drawers, fixed-width, and rules (#128)

  • (org) treat $$ display math as Structure (#120)

  • (org) close greater blocks by matching NAME (#117)

  • (reflow) hang RST enumerated item continuations (#74)

  • (rst) keep substitution references atomic (#241)

  • (rst) hang and reflow admonition and figure bodies (#219)

  • (rst) keep substitution references out of leftover table rows (#218)

  • (rst) keep consecutive Jinja statements on their own lines (#216)

  • (rst) treat footnotes and citations as hung prose (#193)

  • (rst) keep two-space list hang inside open inline literals (#164)

  • (rst) keep line blocks out of the grid-table arm (#192)

  • (rst) keep two-space list hang inside open quotes (#160)

  • (rst) blank closes comments so later indent is a hung quote (#198)

  • (rst) treat suffix role closer as sentence end (#183)

  • (rst) keep compact list-like prose as one paragraph (#163)

  • (rst) keep two-space bullet marker hang width (#162)

  • (rst) keep definition hang after nested directives (#165)

  • (rst) keep two-space list hang inside open parentheses (#161)

  • (rst) keep nested list continuation hang at inner width (#154)

  • (rst) keep two-space list hang after abbreviations (#158)

  • (rst) keep over-indented list continuation as a definition (#159)

  • (rst) hang list sentences after a :role:` continuation (#157)

  • (rst) treat full Docutils adornment charset as section underline (#151)

  • (rst) scan simple tables to the matching-width closer (#146)

  • (rst) treat anonymous hyperlink targets as structure (#144)

  • (rst) treat quoted literal blocks as structure (#142)

  • (rst) treat doctest blocks as structure (#138)

  • (rst) hang alpha, roman, and paren enumerators (#136)

  • (rst) treat option lists as structure plus hung prose (#127)

  • (rst) treat role closer as sentence end (#76)

  • (rst) keep block quote indent (#75)

  • (rst) keep section adornments on their own line (#73)

  • (rst) keep two-space code-block bodies indented (#72)

  • (sentence) peel shortest closer before quote-capital (#272)

  • (sentence) keep markdown reference links atomic (#227)

  • (sentence) split same-line lowercase proper noun after period (#186)

  • (sentence) do not split bang inside markdown code (#118)

  • (sentence) keep break before lowercase proper noun (#77)

Continuous Integration

  • (docs) do not serialize PR builds on the pages lock (#200)

v0.11.1 - 2026-09-09

Features

  • (cli) default to pandoc when a writer is available (#68)

  • (pandoc) keep RST comments and snapper pragmas on write (#67)

  • (pandoc) write reflowed AST through pandoc writer (#56)

Bug Fixes

  • (ci) install cargo-dist on Windows and macOS ARM (#42)

  • (markdown) keep indented inner fences as code body (#55)

  • (pandoc) write in-process when FFI exports a writer (#63)

  • (pandoc) refuse comments and snapper pragmas instead of dropping them (#62)

  • (rst) join compact list hangs into one prose region (#66)

  • (rst) keep two-space directive bodies as structure (#54)

  • (rst) keep comment bodies as structure (#52)

  • (rst) keep list continuation paragraph hang (#51)

  • (rst) keep definition lists as structure (#50)

  • (rst) keep simple tables as structure (#49)

  • (sentence) markup closer-split needs a real next sentence (#53)

Documentation

  • (i18n) regenerate gettext catalogs for v0.11 docs (#69)

Tests

  • (pandoc) keep wasm and editors on native parsers (#64)

v0.11.0 - 2026-09-08

Bug Fixes

  • (mcp) #[tool_handler] implements list_tools / call_tool; initialize advertises tools and names the server snapper instead of the empty rmcp default

  • (vscode) vscode-languageclient is a runtime dependency only, so vsce package ships the module the extension requires

  • (vscode) out/extension.js is an esbuild bundle (vscode stays external); the VSIX no longer needs node_modules at runtime

  • (ci) release and nvim workflows install cargo-dist from a sha256-pinned archive and Rust via dtolnay/rust-toolchain; they no longer pipe rustup.sh or cargo-dist-installer.sh into sh

  • (sentence) a period immediately before Markdown/Org closers (**, *, backticks, ](url)) is a sentence end, so **Bold sentence.** Next splits and a hand break survives the next run

  • (latex) % snapper:no-preamble and chapter files with no \\begin{document} / \\documentclass are body; class and package files stay preamble

  • (rst) adjacent *, -, +, 1., and #. list items stay separate regions, so compact lists are not glued onto one line


v0.10.0 - 2026-08-10

Features

  • (latex) [latex].verbatim_envs / structure_envs / verbatim_commands in .snapperrc.toml add names to the built-in lists (minted/lstlisting/verbatim, NON_PROSE_ENVS, \\verb/\\lstinline); missing keys keep today’s defaults. Extra command names are tokenized like \\verb before split. No regex other: key

  • (reflow) --clause-breaks / clause_breaks with max_width = 0 inserts a newline after every independent-clause mark (,, ;, :, em dash, --) that is already followed by whitespace; a one-clause sentence stays one line; max_width > 0 keeps wrap-prefer-clause. Tokens such as 1,000, URLs, --flags, and unspaced dashes never split. --check uses the same mode

  • (cli / check) --check --output-format json|sarif emits 1-indexed fused / wrap / long diagnostics with excerpts; long is advisory unless --strict-long; stdin --check honors the same JSON/SARIF and exit codes; SARIF URIs are repo-relative (or file: plus invocations[0].workingDirectory)

  • (mcp) mcp is a default feature, so published snapper / snapper-fmt binaries include the stdio server; agents should call it (or the CLI) instead of applying sembr/skills by hand

  • (mcp) format_text accepts clause_breaks, range (start/end, 1-indexed inclusive), and max_width (default 0)

  • (mcp) check_formatting accepts clause_breaks (default false) and returns would_reformat identical to CLI --check, plus the same line diagnostics

  • (safety) native parsers record source byte ranges and splice reflowed prose into the original document; Structure/Code/Blank are input slices

  • (safety) format_text runs to a byte fixpoint (cap 4, including A/B cycles) or returns the original; a format-local oracle (region-kind + slice tree; Markdown HTML plus a code-byte check) mismatch also returns the original

  • (safety) format_bytes refuses invalid UTF-8 with InvalidUtf8Error; --use-pandoc refuses (PandocCannotSplice) because the AST has no source offsets

  • (safety) property tests and a cargo fuzz target (fixture corpus) drive format_text per format with the backstops off

  • (code-block) comment reflow copies non-comment lines as original slices; only comment spans are rewritten

Bug Fixes

  • (latex) render oracle and --check payloads honor [latex] extras, so a configured \\Verb!%! is not a comment and production backstops no longer revert the file

  • (latex) tokenize \\verb / \\lstinline (optional [...]) before split so inner % is not a comment and inner .!? do not split; unmatched \\verb runs to EOL; unlisted \\begin / \\end are region bounds (optional [...] stays on the begin token); mid-line \\begin{equation} leaves leading words as prose; nested same-name envs (including verbatim/lstlisting) close on matching depth, so \\end{python} inside lstlisting does not steal the closer; listing body scans raw \\begin/\\end (no % stop, no \\verb skip) so print(1) % \\end{lstlisting} and print(\"%\") still close

  • (check) fused and long run on the parser prose payload, so 1. Hello world. and See Fig. 1. % TODO cite are not false fused

  • (reflow) splice keeps the trailing space before a mid-line TeX % comment so that line stays one source line

  • (reflow) --max-width keeps links, images, inline code, autolinks, $math$, and Org [[...]] on one line (overlong token may sit alone; no hyphen splits); wrap-created lines that the format grammar would read as a new block (fences, thematic breaks, [ref]:, HTML, >foo, LaTeX %/\begin/\section, RST .., Org |, lists) are backslash-escaped in Markdown or skip-cut (loop) elsewhere; <https://...> / <user@host> are autolinks, not HTML openers, so wrap does not inject \\<; skip-cut wins when a \\ would corrupt an inline token; wrap measures hanging indent and tests interrupt after it; no NBSP; first line of a list item stays a list; second pass does not accumulate backslashes; the render oracle treats wrap-created Markdown escapes (\-, 1\\.) as the source words so splice does not return the original

  • (reflow) list continuation sentences hang at the marker width so Org rejoins the item on reparse; Markdown quotes repeat the > prefix (> One. / > Two., nested > >)

  • (latex) a trailing % eats the newline (TeX nospace join), so foo%\\nbar is no longer emitted as foo% bar (which comments out bar); mid-line % comments leave prose

  • (sentence) w.r.t. is a multi-word abbreviation; \\(...\\) and $$...$$ stay atomic like $...$

  • (cli) unknown source extensions (.rs, .py, no extension) are refused unless --format is explicit; .txt remains plaintext

  • (org / sentence) verbatim and inline-code spans pair to the first closer that satisfies Org’s border and post rules, so an = or ~ inside the span no longer orphans the real closer onto the next line

  • (sentence) CommonMark */** and GFM ~~ pair by flanking rules, so **the end. Still bold** stays one sentence while **complex**. Equity may split after the closer

  • (markdown) > is kept on each reflowed content line (including max_width wraps; prefix counts toward width); two-space and backslash hard breaks are not joined with a space; a quote hard break does not leave a stray > on the next non-quote line; multiline <!-- ... --> is structure (<!-- snapper:off --> still works)

Documentation

  • README distinguishes snapper from admk/sembr and sembr/skills; crate keywords include sembr and markdown

  • (markdown / sentence) inline code delimited by two or more backticks can contain a shorter backtick run

  • (code-block) a block-comment closer inside a string no longer ends the comment; quote-sequence closers (""") still match naively so Python docstrings reflow

  • (sentence) abbreviation merge does not invent a space before LaTeX ~ (so Eq.~\ref{} stays attached once org ~code~ pairing no longer swallows that tilde)

  • (sentence) restore wrapped placeholders from the outside in, so a markdown-link regex match that contains a paired-span token cannot leak \x00PHn\x00 into output

Notes

  • Native format_text refuses --use-pandoc (PandocCannotSplice); splice needs source offsets the AST does not carry

  • --clause-breaks with the default max_width = 0 is SemBr rule 5 (break at existing whitespace after clause punct); max_width > 0 still wrap-prefers

  • Published binaries include the MCP server (mcp is a default feature)


v0.9.1 - 2026-08-04

Bug Fixes

  • (reflow) clause breaks only engage when a sentence exceeds max_width and only at whitespace after the punctuation; v0.9.0 split at every clause mark, including inside tokens (1,000, 10:30, URLs, --flags, unspaced em dashes), which inserted spaces into rendered output

  • (cli) --color auto honors the NO_COLOR environment variable

  • (neural) nnsplit model loads are serialized process-wide; concurrent first-use construction could read a partially downloaded model

Notes

  • v0.9.1 supersedes v0.9.0 on every channel; do not use v0.9.0 with --clause-breaks

  • RELEASING.md documents the release channels and recovery rules; scripts/check_release_ready.sh gates version parity, tag hygiene, and the conda sha256


v0.9.0 - 2026-08-04

Features

  • (cli / diff) global --color auto|always|never for top-level --diff, sdiff, and git-diff; shared ANSI styling for headers, hunks, additions, and removals (closes #6)

  • (reflow) --clause-breaks / clause_breaks config: prefer soft breaks after independent-clause punctuation (comma, semicolon, colon, em dash) under max_width (closes #7)

Notes

  • Subcommand --no-color remains as an alias for --color never

  • --color auto honors the NO_COLOR environment variable

  • Clause breaks only apply to sentences that exceed max_width, and only at whitespace after the punctuation; tokens such as 1,000, 10:30, URLs, and --flags never split


v0.8.1 - 2026-07-20

Bug Fixes

  • (pre-commit) ship a real id: snapper hook (snapper --in-place) with extension-based files matching; drop leftover SemBr id/entry and invalid identify type org

  • (lockfile) CI asserts Cargo.toml package version equals the snapper-fmt entry in Cargo.lock and that cargo metadata --locked succeeds (catches the 0.7.9 tag skew)

Features

  • (cli) install snapper-fmt as a second binary name (same program as snapper) so hosts that already own openSUSE’s snapper can call the formatter without PATH surgery

Documentation

  • Installation: name collision with openSUSE snapper; prefer snapper-fmt on those systems

  • Pre-commit section: which extensions the hook matches and that Rust is required to build it


v0.8.0 - 2026-07-20

Features

  • (pandoc) optional --use-pandoc path: parse with pandoc (CLI JSON or in-process FFI), classify regions from AST node kinds, reflow only prose (Para/Plain); structure (headers, code fences, tables, lists, math islands) preserved

  • (pandoc) --pandoc-backend auto|ffi|cli (default auto: prefer warm FFI when available, else CLI); explicit ffi fails closed if the library is missing

  • (pandoc) content-addressed AST cache (SNAPPER_PANDOC_CACHE / SNAPPER_PANDOC_CACHE_DIR)

  • (pandoc-colink) opt-in Cargo feature: absorb libsnapper_pandoc.a from native/snapper-pandoc/build-static.sh (ghc -staticlib) into one snapper binary — no SNAPPER_PANDOC_LIB discovery, no libHS* RUNPATH graph; not enabled by default (default/cargo-dist remain GHC-free)

Bug Fixes

  • (org / latex) keep full headline and sectioning lines as Structure (do not reflow multi-sentence titles; no orphan title lines without stars / mid-brace splits)

  • (markdown) keep setext headings (title + =/- underline) as Structure so multi-sentence titles do not reflow and underlines are not glued onto title text

  • (ci) exclude pandoc-colink from WASM feature matrix (--all-features panic without static archive); colink still fail-closed in main CI

Documentation

  • Native flib README: static archive vs shared dlopen; howto orgmode pandoc backend; UPX is optional packer only (not used in release)

  • Formats reference: Org headlines, LaTeX sectioning, Markdown ATX and setext headings are full Structure lines

Tests / CI

  • AST fixture tests (JSON on disk) run without pandoc binary; live CLI/FFI parity tests skip cleanly when neither is installed; CI asserts colink without .a fails with archive message; default cargo test stays green without GHC

  • Unit and format_text coverage for multi-sentence Org headlines, LaTeX \section{...} titles, and Markdown setext

Notes

  • Plain release binaries stay ~16 MiB class; static-colink builds are larger (~64 MiB class on linux) and optional for multi-format in-process use


v0.7.9 - 2026-07-07

Bug Fixes

  • (markdown) keep ATX headings as a single Structure line (do not reflow titles after ### 1. or mid-heading periods; fixes orphan ### N. lines, snapper-25kc)

Tests

  • Unit and integration coverage for numbered ATX headings with inline code


v0.7.8 - 2026-06-27

Features

  • (wasm / word) local wasm-pack build of packages/snapper-wasm and Word add-in dist/ for sideload; VS Code extension published 0.7.8 to Marketplace

  • (parser) Region::Code for Org/Markdown/LaTeX/RST source blocks; [code.<lang>] comment reflow and optional --format-code

  • (sentence) delimiter-span post-pipeline (quotes, parens, brackets); shared by rules and --neural

  • (sentence) neural path protects inline tokens (links, emphasis, …) before the model, then restores and refines

  • (cli) multi-file splitter reuse (one build per format/lang/neural/extras key); parallel multi-file always

  • (reflow) parallel region reflow for large documents (cli feature, ≥32 regions)

Bug Fixes

  • (org / sentence) trailing > on headings; org emphasis not pseudo-headlines; space-safe segment glue after neural cuts

Documentation

  • Span policy in formats reference; README/pre-commit pin v0.7.8; MCP/site/VS Code code-block accuracy

Tests / CI

  • sentence_delim_props matrix + proptest; multi-format and code-comment span tests; CI dogfood snapper --check on docs/examples


v0.7.7 - 2026-04-11

Bug Fixes

  • (config) honor project config across cli and watch - (5f5179d) - HaoZeke


v0.7.6 - 2026-04-09

Bug Fixes

  • (markdown) join list-item continuation lines before sentence splitting - (8e45528) - HaoZeke