Skip to content

Update pre-commit hook vale-cli/vale to v3.22.0 - #47

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/vale-cli-vale-3.x
Open

renovate[bot] wants to merge 1 commit into
mainfrom
renovate/vale-cli-vale-3.x

Conversation

@renovate

@renovate renovate Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Type Update Change
vale-cli/vale repository minor v3.17.1v3.22.0

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.

Note: The pre-commit manager in Renovate is not supported by the pre-commit maintainers or community. Please do not report any problems there, instead create a Discussion in the Renovate repository if you have any questions.


Release Notes

vale-cli/vale (vale-cli/vale)

v3.22.0

Compare Source

Spelling

  • split: true checks the parts of an identifier (getHTTPResponse_v2get, Response) and reports each at its own position.
  • The engine now follows Hunspell's case model, compounding, and affix rules, and passes Hunspell's own test suite.
  • Suggestions come in Hunspell's order, and words from ignore files and vocabularies are offered ahead of dictionary words.
  • A loaded dictionary is shared across spelling rules.

Vocabularies

  • A section can set its own Vocab, which adds to the global one and gets Vale.<Name>.Terms and Vale.<Name>.Avoid rules.
  • A period in an entry is text, not a wildcard, and a phrase matches across a line wrap.
  • A Vale.Terms alert offers the entry's spelling as a fix.

Configuration

  • An empty BasedOnStyles clears a section's inherited settings; UNSET clears one rule or style.
  • A [formats] key can be a file name or a glob, not only an extension.
  • A scope can negate an inline element (text.raw, paragraph.link, and so on).
  • TokenIgnores and BlockIgnores apply to HTML and DITA.

Formats

  • MDX: indented blocks are never code, an expression followed by prose keeps the prose, one-line elements are linted, and alerts no longer land inside JSX tags.
  • DITA: all files in a run are converted in one toolkit call.
  • Jupyter notebooks are a format of their own.
  • Front-matter alerts are placed by the field's position.
  • URLs in code comments and RST are treated consistently.

Changelog

  • e109c06 fix: keep a URL out of prose in code comments and RST
  • 79a4875 feat: let a scope negate an inline element
  • cf16166 perf: convert a run's DITA files in one toolkit run
  • 68e022b feat: apply ignore patterns to DITA
  • f41bebb fix: cover a promoted RST title with the comment region written above it
  • 18dd863 fix: apply a vale-off region to a footnote written inside it
  • 9bcbf9f test: pin a vale-off region after front matter and import lines (#​1073)
  • 344fd9b fix: locate a block's later matches in that block, not in a later copy of its text
  • ec7e5f0 feat: match a vocabulary phrase across a line wrap, read a period as text, and offer the term as a fix
  • 0194fbb feat: suggest from the project's own words
  • 49422de fix(mdx): lint a one-line element's text as prose, and keep alerts out of JSX tags
  • 5ab91a5 fix: place front-matter alerts by the field's position, not by searching the file
  • dcf7f18 fix(mdx): end an expression at its brace, keep prose after it, and parse indented blocks
  • 8a9fd38 fix: keep the whitespace before an inline comment, so the words around it stay apart
  • 7c61ce4 perf: bound the inline-markup lookahead by byte length, not a rune count of the whole context
  • 1e73019 fix: read a notebook cell's source with a tagless switch,
  • 9e66106 feat: let a section name its own vocabularies
  • fc513c5 perf: share a loaded dictionary across spelling rules, and take the regexp2 fold fix
  • f278585 feat: lint a Vale rule by its message and description, not its patterns
  • 85992f2 feat: let a spelling rule split identifiers and check their parts
  • cb5885f feat: suggest in Hunspell's order, and score suggestions against its fixtures
  • 52094c7 fix: read affix headers with trailing fields, escaped slashes, any-script digits, and Turkic casing
  • 17417ac feat: honor IGNORE, convert input by the longest ICONV rule inside spell, and read ß as SS in all-caps under CHECKSHARPS
  • a4e2853 fix: read a COMPOUNDRULE as flags and operators, quote its words, and match a capitalized word lower-cased
  • bfd0b42 perf: resolve affixed words lazily from roots, and read dictionaries as Hunspell does: per SET, byte flags without FLAG, literal hyphens in classes
  • 06325d9 feat: adopt Hunspell's case model, and keep ignore-list words case-lenient
  • 5452059 feat: pass Hunspell's German compounding fixtures: CHECKCOMPOUNDREP, COMPOUNDWORDMAX, prefix strips, and circumfix pairing across levels
  • a770129 feat: apply CHECKCOMPOUNDPATTERN, with replacements, and keep an ONLYINCOMPOUND suffix off a compound's end
  • f143508 feat: check compound position flags, permit and forbid flags, ONLYINCOMPOUND, FORCEUCASE, and word pairs
  • f9178fb feat: check compound boundaries, apply Hunspell's default BREAK rules, and forbid words per homonym
  • 25d8fbc test: run Hunspell's own fixtures as a conformance suite
  • c2d6243 feat: let an empty BasedOnStyles reset a file's inherited rule settings, and add UNSET
  • 6c2d99d feat: let a formats key name a file or a glob, not only an extension
  • 62d47db fix: accept the upper-cased form of a capitalized entry, and suggest in the word's case
  • f8ded8d feat: let a caller observe each block and time each rule
  • cd86a3c perf: segment a file only when a sentence-scoped rule runs on it
  • cf649e6 chore: add commit msg hook
  • 2c3aa80 fix: hasCaptureGroup logic

v3.21.0

Compare Source

doc(...) selections

A scope term that selects document elements by CSS selector, the same way in every format. Headings are wrapped in nested section elements first, so a rule can name a section:

extends: occurrence
message: "An ADR has a Decision section."
level: error
scope: 'doc(section:has(> h2:contains("Decision")))'
token: '(?s).'
min: 1

Alone, the selection is one block. Beside a scope, sentence & doc(...), it narrows that scope to the element. Negated, it excludes it. A metric rule with a scope now measures each block the scope names, so a section can have a word budget.

Docs: Selections, metric

TextFSM Views

A textfsm View reads plain text through a template in the form Google's TextFSM defined, run by Vale itself. What it captures becomes scopes placed at their line and column, so a rule can target a commit's subject or a transcript's turns. A conditional rule's new in key looks for second in another View scope, so a ! in a subject can require a BREAKING CHANGE: trailer.

Docs: TextFSM guide, conditional

Jupyter notebooks

.ipynb is a format: Markdown cells as Markdown, code cells as code in the kernel's language, outputs skipped. Alerts point into the notebook file itself.

Docs: Jupyter

Changelog
  • ed71176 perf: index the walker's context instead of scanning it
  • 252d096 perf: index rune positions and resume column counts per block
  • 0dfd6e8 chore: accept configs and docstring in vocab
  • 9dfbc90 docs: add GitBook badge
  • 7285105 docs: README
  • 5992ffc docs: update README
  • d0ea8b4 feat: apply BlockIgnores and TokenIgnores to HTML
  • b4e2aa7 fix: keep the source's space between a dash and inline markup (#​1177)
  • 4774ced fix: a sequence rule with a negated scope double-reports every match (#​1169)
  • 91af404 fix: make the CLA bot signable
  • 0f8ed52 feat: lint Jupyter notebooks as a format of their own
  • 4da60aa feat: join a selected list into one value, so a notebook cell is one block
  • 683a2f6 feat: let a conditional look for its consequent in another View scope
  • 4c0f64f fix: apply a dasel View to any file its section matches
  • 1734e78 feat: give an unfilled textfsm value an empty scope, so min can report it
  • abbf2ec test: read past Git's comment lines in the commit View
  • 7ebd026 fix: name the file and both dasel causes when a View selector fails
  • 8aab425 fix: let a raw pattern contain a percent sign
  • 0c35215 fix: place a zero-width match, and report a rule error under a View
  • 1e4f6ed fix: keep a package's StylesPath out of the path list, and let the project's rule settings win
  • c18dcab ci: tell the docs about a release
  • e0a2250 feat: validate actions at load, carry their suggestions, and let edit run a pipeline
  • d039c95 feat: read plain text through TextFSM templates as a view engine
  • cfddd62 feat: select document elements with doc(...) and measure any block
  • 42c3ba6 fix: keep a line break after inline markup (#​1174)

v3.20.0

Compare Source

Vale 3.20.0 ships a set of features aimed at style authoring at library scale. Std, the new standard library, is built on all three and walks through each; Voices is the first package to consume them.

A rule can extend another rule

An extends value containing a dot names a rule rather than a check: the new rule starts from that rule's full definition and lays its own keys on top. Two styles can share one carefully built pattern and disagree only about message, level, or a handful of entries:

# styles/House/OxfordComma.yml
extends: Std.Punctuation.OxfordComma
message: 'Serial comma, always.'
level: error

Three lines, your name on the alert, the parent's machinery underneath — including every false-positive guard it ever gains. The parent has to be present on the StylesPath, not enabled: inheritance is a file reference, and vale sync is what puts the file there. A child can itself be extended, up to ten rules deep. The one thing you can't extend is a Vale.* built-in, which is generated at runtime and has no file.

A bare key replaces the parent's value outright. Lists and maps also take overlay edits:

extends: Direct.Hedging
message: "We don't hedge."
tokens+:
  - perhaps the best answer is
tokens-:
  - one could argue

key+ appends to a parent list, or merges into a parent map with the child's entries winning; key- removes entries by their source text, or the named keys from a map. Removing something the parent doesn't have is a compile error, on purpose: if upstream renames an entry your child was removing, you hear about it when the rule compiles instead of diverging silently. Writing both key and key+ in one file is refused.

A directory whose name starts with _ or . is skipped at load time but stays visible to extends, so a pattern shared by several rules can live in one file without itself becoming a rule. A fragment is validated as the chain's root, so it must carry a message — even one no alert will show.

Docs: Extending another rule

Nested rule directories

A style can organize its rules in subdirectories, and the path joins the name: Std/Grammar/PassiveVoice.yml is Std.Grammar.PassiveVoice everywhere a rule name goes — alerts, configuration, in-text comments, filters, and extends. There is no depth limit, and directories prefixed with . or _ are inert, so drafts and shared fragments can sit inside a style without loading.

Docs: Nested directories

Tune a rule's scalars from configuration

A bracketed key overrides one scalar on a rule you have enabled, keeping the rule's identity:

[*.md]
BasedOnStyles = Std

Std.Readability.SentenceLength = error
Std.Readability.SentenceLength[max] = 30

The word in brackets is the key as it appears in the rule's YAML, so any scalar a rule declares is a dial. Values coerce at compile time, and an unknown parameter fails the rule's compilation rather than being silently dropped. Structural fields — tokens, swap, message — are refused with a pointer at extending the rule in a style, which is what authoring is for; [level] is refused because the classic Style.Rule = error syntax already says that.

Docs: Parameters

Changelog

  • fdc4cc7 fix: report an occurrence shortfall at the scope that fell short
  • d978056 feat: add an apply mode to vale fix
  • 58392ff fix: honor comment directives at any indent
  • fcd23e6 feat: report per-check alert counts under --counts
  • 2545b00 docs: add contributor license agreement and PR comments
  • 9972e93 docs: add AI-Assisted Contributions
  • 33f473d ix: mask an inline element in SkippedScopes instead of dropping it
  • 03e45ee feat(spell): honor Hunspell BREAK rules
  • 29e67d2 fix(config): keep escaped commas in TokenIgnores and BlockIgnores
  • 71b13ca fix(spell): narrow COMPOUNDMIN inside its range check
  • 8bd83b5 chore: bump golang.org/x/crypto to v0.55.0
  • af123f4 feat: tune a rule's scalars from configuration
  • 05875a9 feat: a rule can extend another rule
  • 6d97c2d feat: nested rule directories, and test cases in-source
  • 5d33823 feat: satisfy negated sequence tokens at boundaries; add region exceptions
  • e9caf5f Satisfy negated sequence tokens at sentence boundaries
  • c62d75f fix: parse a compound stanza at a fixed width, not the target's (#​1159)
  • 6d22b96 refactor: other org refs
  • 3f26c98 refactor: migrate org
  • b8560d8 fix: read a self-closing tag as the boundary it is (#​1157)

v3.19.0

Compare Source

MDX: JSX children are now linted

Vale now reads a JSX element's children as the Markdown they are — matching MDX's own grammar, where only tags, attributes, and {...} expressions are JavaScript. The prose inside wrapping components like <Steps>, <Tabs>, or <Aside> is linted at its exact source position, as is the text of inline elements (<abbr>HTML</abbr> — "HTML" is read as part of its sentence). For documentation built on component-heavy frameworks like Astro Starlight, this can mean a quarter of your prose is now covered.

Children carry the element's name as a class scope, the same way MyST and Quarto directives work — so a rule can target one component's content (scope: text.class.Aside), and a component whose content shouldn't be linted can be excluded by name:

IgnoredClasses = RawOutput

That's also the escape hatch if you preferred the old skip-everything behavior. Attribute values, expressions, self-closing elements, and elements opened and closed on a single standalone line are still treated as code.

Changelog

  • 405a7da fix: strip a comment's delimiters, not its prose's (#​1151)
  • 7766415 feat(code): add Elixir comment and doc-attribute extraction (#​1151)
  • 055db43 feat: let a sequence token ask for repeated occurrences (#​899)
  • 9ba5dea feat: lint a JSX element's children as the Markdown they are (#​1155)
  • 8702043 fix: lint a block title as written, without its generated label (#​1152)
  • d0e65f4 docs: update contributing for native MDX and Typst

v3.18.0

Compare Source

v3.18.0 is the largest expansion of Vale's format support since v3.0.0.

MDX is now parsed natively — mdx2vast is no longer required. This release also adds support for four new markup formats: Typst (through the new typst2vast program), Quarto, MyST, and QDoc. R Markdown now works out of the box, and comment extraction now covers Lua, PHP, Haskell, R, Perl, and SCSS.

Beyond formats, there's a new meta scope for a document's machine-readable content, a --plain-progress flag, and per-package logging for vale sync in CI — plus a long list of fixes that make alert positions and scoping more accurate across every format.

✨ Sponsor Spotlight

Special thanks to Promptless — Vale's newest sponsor and the latest to receive a Spotlight page. Promptless suggests doc updates when your product changes; you review, edit, and ship.

Changelog

  • 6c382ec fix: stop element-scoped rules from matching sentence fragments (#​1150)
  • 9b9594d fix: don't treat a word before a code span as inline markup (#​1147)
  • 2b159ab fix: stop corrupting suggestions containing 'PIPE'
  • 390dda6 fix: compile glob patterns once at construction (#​1145)
  • fcf0740 fix(ls-metrics): prevent panic on empty directory (#​1144)
  • dd09d42 fix(core): resolve Lang and Transform in section order, not map order (#​1143)
  • 85ee608 fix(dita): report dita's own error output instead of just the exit status (#​1141)
  • fd8c2e0 refactor: satisfy revive's empty-block
  • 2f65b83 fix: close display math on any line ending with $$ (#​1148)
  • e587329 fix(lint): treat an HTML comment as a text boundary outside inline elements (#​1140)
  • 4691bd3 docs: add new spotlight
  • 37cb109 feat: add --plain-progress
  • 12fbbd7 feat: log each package when sync isn't writing to a terminal
  • 9a1a16c fix: mark a QDoc image that has no alt text, and publish inline ones
  • c154ac2 Keep the extracted text one line per source line (#​1135)
  • 8fe9804 refactor: CLI clean up and subcommand help
  • ae6d749 feat: add vale test
  • e5a0286 fix: read a shebang as a POSIX path
  • eec2f59 fix: read a .qdocinc as the include it is, and keep meta out of prose
  • 7618d04 fix: only hand the Docutils source to a Python interpreter
  • b596b0d fix: stop a string run's helper processes the way a file run does
  • f3f3402 fix: keep vale off working when QDoc prose is escaped
  • 54efd3b fix: escape QDoc markup
  • 5666297 fix: treat a snippet marker inside a QDoc comment as markup
  • c2d1a55 feat: add a meta scope for a document's machine-readable content
  • 33e4012 fix: close QDoc's code blocks on the right command, and scope its divs
  • 5ae4867 fix: read only /*! as QDoc, and cover commands
  • e60b5bc fix: keep a rule's level in the section that set it
  • c1e2fa0 fix: honor IgnoredScopes when a markup format is mapped onto source
  • 85c1343 fix: place a match inside a block that inline markup rewrote
  • b47ccb0 fix: don't mask an autolink's URL twice
  • 65f5687 fix: skip $…$ inline math
  • b3bade4 fix: lint a tight list item's own text as its own block
  • 4a6b7cf Don't lint a shebang as a comment (#​1134)
  • 77179c0 fix: report spans against the file's actual bytes
  • 7f429e3 test: pin issue 1007's frontmatter and blockquote scenarios
  • b049e35 feat: support the .scss extension
  • b678b8d test: add QML case
  • e82432d feat: extract Lua, PHP, Haskell, R, and Perl comments with tree-sitter
  • 0e2f8bf eat: support QML sources via qml = qdoc
  • cc710aa fix: treat only block comments as QDoc documentation
  • bd1f33a ci: install typst2vast, drop mdx2vast
  • 9708be6 feat: support Typst
  • 15115bf fix: place a rewritten block by its longest word, not its last
  • 5c91639 fix: skip a repeated match's prior occurrences by count, not by masking
  • db8c83c feat: support QDoc
  • fca7b79 feat: support Quarto
  • 286fc59 feat: parse MDX natively, dropping mdx2vast
  • fedaf20 feat: support MyST
  • eec788d fix: read the character actually beside a match for inline code
  • 590278e feat: lint R Markdown out of the box
  • 4d8e228 fix: strip tab indentation from block comments (#​1131)
  • 02fb654 fix: switch on what every term of a chained scope needs
  • f011cb0 fix: keep 'scope: paragraph' out of headings, tables, lists, and blockquotes

Configuration

📅 Schedule: (in timezone Etc/UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot force-pushed the renovate/vale-cli-vale-3.x branch from 4c5c279 to 239800a Compare September 3, 2026 04:05
@renovate renovate Bot changed the title Update pre-commit hook vale-cli/vale to v3.19.0 Update pre-commit hook vale-cli/vale to v3.20.0 Sep 3, 2026
@renovate
renovate Bot force-pushed the renovate/vale-cli-vale-3.x branch from 239800a to 8c65196 Compare September 10, 2026 03:57
@renovate renovate Bot changed the title Update pre-commit hook vale-cli/vale to v3.20.0 Update pre-commit hook vale-cli/vale to v3.21.0 Sep 10, 2026
@renovate
renovate Bot force-pushed the renovate/vale-cli-vale-3.x branch from 8c65196 to c4601a7 Compare September 17, 2026 20:17
@renovate renovate Bot changed the title Update pre-commit hook vale-cli/vale to v3.21.0 Update pre-commit hook vale-cli/vale to v3.22.0 Sep 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants