Skip to content

Bump vale-cli/vale to 3.21.0 - #49103

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

Bump vale-cli/vale to 3.21.0#49103
code-infra-renovate[bot] wants to merge 1 commit into
masterfrom
renovate/vale-cli-vale-3.x

Conversation

@code-infra-renovate

@code-infra-renovate code-infra-renovate Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Update Change
vale-cli/vale minor 3.19.03.21.0

Release Notes

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

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)

Configuration

📅 Schedule: (in timezone UTC)

  • Branch creation
    • Between 12:00 AM and 04:59 AM, only on Sunday (* 0-4 * * 7)
  • 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 self-hosted Renovate.

@code-infra-renovate code-infra-renovate Bot added the dependencies Update of dependencies. label Sep 6, 2026
@code-infra-dashboard

code-infra-dashboard Bot commented Sep 6, 2026

Copy link
Copy Markdown

Deploy preview

https://deploy-preview-49103--material-ui.netlify.app/
QR code for https://deploy-preview-49103--material-ui.netlify.app/

Bundle size

Bundle Parsed size Gzip size
@mui/material 0B(0.00%) 0B(0.00%)
@mui/lab 0B(0.00%) 0B(0.00%)
@mui/private-theming 0B(0.00%) 0B(0.00%)
@mui/system 0B(0.00%) 0B(0.00%)
@mui/utils 0B(0.00%) 0B(0.00%)

Details of bundle changes


Check out the code infra dashboard for more information about this PR.

@code-infra-renovate
code-infra-renovate Bot force-pushed the renovate/vale-cli-vale-3.x branch from 97bbfbc to 42f98aa Compare September 9, 2026 23:17
@code-infra-renovate code-infra-renovate Bot changed the title Bump vale-cli/vale to 3.20.0 Bump vale-cli/vale to 3.21.0 Sep 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Update of dependencies.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants