Skip to content

chore(vale): accept upstream Vale 3.22.0 - #357

Merged
theCodeDrift merged 1 commit into
mainfrom
vendor/vale/republish
Sep 21, 2026
Merged

theCodeDrift merged 1 commit into
mainfrom
vendor/vale/republish

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Upstream Vale is ahead of the version this repository packages.

This updates .github/scripts/vale-manifest.json to the new upstream
version and replaces every platform's SHA256 with the digest from
upstream's vale_<version>_checksums.txt.

Reviewing this is the trust boundary. Merging it authorizes the
publish phase to download those exact archives and package them; a
download that does not match a digest here aborts the run and
publishes nothing. Check the digests against upstream's checksums file
for the release before approving.

Merging this triggers the publish phase, which stamps every platform
package <valeVersion>-<yyyymmddhhmmss> and publishes the set. That
publish is inert on its own: @taskless/cli pins exact versions, so
nothing reaches a consumer until that pin is deliberately bumped —
which is what vale-upgrade.yml proposes, separately, once this has
merged and published. Merging THIS changes nobody's install.

This pull request rolls: if upstream releases again before it merges,
the branch, title, and body are rewritten to the newer version rather
than a second pull request being opened. Push a commit to the branch
and that stops — the workflow will not force-push over a commit it did
not write.


Upstream release notes — 3.22.0

https://github.com/vale-cli/vale/releases/tag/v3.22.0

Spelling

  • split: true checks the parts of an identifier (getHTTPResponse_v2 → get, 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

  • e109c062 fix: keep a URL out of prose in code comments and RST
  • 79a48752 feat: let a scope negate an inline element
  • cf161663 perf: convert a run's DITA files in one toolkit run
  • 68e022b4 feat: apply ignore patterns to DITA
  • f41bebb6 fix: cover a promoted RST title with the comment region written above it
  • 18dd8632 fix: apply a vale-off region to a footnote written inside it
  • 9bcbf9f9 test: pin a vale-off region after front matter and import lines (#1073)
  • 344fd9b0 fix: locate a block's later matches in that block, not in a later copy of its text
  • ec7e5f01 feat: match a vocabulary phrase across a line wrap, read a period as text, and offer the term as a fix
  • 0194fbbd feat: suggest from the project's own words
  • 49422de5 fix(mdx): lint a one-line element's text as prose, and keep alerts out of JSX tags
  • 5ab91a5d fix: place front-matter alerts by the field's position, not by searching the file
  • dcf7f18c fix(mdx): end an expression at its brace, keep prose after it, and parse indented blocks
  • 8a9fd38e fix: keep the whitespace before an inline comment, so the words around it stay apart
  • 7c61ce4f perf: bound the inline-markup lookahead by byte length, not a rune count of the whole context
  • 1e730195 fix: read a notebook cell's source with a tagless switch,
  • 9e661060 feat: let a section name its own vocabularies
  • fc513c5f perf: share a loaded dictionary across spelling rules, and take the regexp2 fold fix
  • f2785853 feat: lint a Vale rule by its message and description, not its patterns
  • 85992f2a feat: let a spelling rule split identifiers and check their parts
  • cb5885f4 feat: suggest in Hunspell's order, and score suggestions against its fixtures
  • 52094c78 fix: read affix headers with trailing fields, escaped slashes, any-script digits, and Turkic casing
  • 17417ac4 feat: honor IGNORE, convert input by the longest ICONV rule inside spell, and read ß as SS in all-caps under CHECKSHARPS
  • a4e2853d fix: read a COMPOUNDRULE as flags and operators, quote its words, and match a capitalized word lower-cased
  • bfd0b420 perf: resolve affixed words lazily from roots, and read dictionaries as Hunspell does: per SET, byte flags without FLAG, literal hyphens in classes
  • 06325d94 feat: adopt Hunspell's case model, and keep ignore-list words case-lenient
  • 54520592 feat: pass Hunspell's German compounding fixtures: CHECKCOMPOUNDREP, COMPOUNDWORDMAX, prefix strips, and circumfix pairing across levels
  • a770129c feat: apply CHECKCOMPOUNDPATTERN, with replacements, and keep an ONLYINCOMPOUND suffix off a compound's end
  • f1435080 feat: check compound position flags, permit and forbid flags, ONLYINCOMPOUND, FORCEUCASE, and word pairs
  • f9178fb7 feat: check compound boundaries, apply Hunspell's default BREAK rules, and forbid words per homonym
  • 25d8fbc7 test: run Hunspell's own fixtures as a conformance suite
  • c2d62437 feat: let an empty BasedOnStyles reset a file's inherited rule settings, and add UNSET
  • 6c2d99d9 feat: let a formats key name a file or a glob, not only an extension
  • 62d47db9 fix: accept the upper-cased form of a capitalized entry, and suggest in the word's case
  • f8ded8dd feat: let a caller observe each block and time each rule
  • cd86a3c6 perf: segment a file only when a sentence-scoped rule runs on it
  • cf649e6e chore: add commit msg hook
  • 2c3aa804 fix: hasCaptureGroup logic

@github-actions github-actions Bot added the skip-changeset PR intentionally ships no release note (bypasses the changeset requirement) label Sep 21, 2026
@theCodeDrift
theCodeDrift merged commit 4bca529 into main Sep 21, 2026
8 checks passed
@theCodeDrift
theCodeDrift deleted the vendor/vale/republish branch September 21, 2026 18:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changeset PR intentionally ships no release note (bypasses the changeset requirement)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant