Skip to content

chore(vale): accept upstream Vale 3.23.0 - #410

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
vendor/vale/republish
Open

github-actions[bot] wants to merge 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.23.0

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

Vale 3.23.0 reads a Sphinx project as Sphinx does, reads the markup inside source-code comments, and reads large files in linear time.

Sphinx

Docutils knows only its own directives and roles, and dropped the body of every one it did not know, without a word: the prose in every versionadded, seealso, tab, or grid was never linted. Vale now decides the rest by a rule that fits nearly every Sphinx construct: the body of a directive Docutils doesn't define is prose, and the text of a role it doesn't define is code. A :ref: written with a title is linted as its title, and :func:, :class:, and :doc: are left alone. An extension's additions that don't fit the rule go in one section, which the reStructuredText and MyST readers both honor:

[sphinx]
CodeDirectives = mermaid, plantuml
ProseRoles = kbd, samp

Nothing needs Sphinx installed. reStructuredText also reads and writes UTF-8 whatever the console's code page, and the Docutils pool now works on Windows.

Docs: Sphinx

The markup inside comments

A tree-sitter View's per-scope type is honored, so a Rust /// comment is read as Markdown, a Python docstring as reStructuredText, and a Javadoc block as HTML, each with its fenced blocks and inline code skipped:

engine: tree-sitter
scopes:
  - expr: (line_comment)+ @comment
    type: md

Each language's documentation convention is understood on top of that: the name a Go doc comment opens with and its [links], rustdoc and KDoc links, Javadoc and JSDoc tags and @example blocks, and a docstring's :param: fields are not prose. A comment addressed to a tool, //go:build, //nolint, # noqa, eslint-disable, is not read at all. Kotlin and TOML have grammars.

Docs: Code Views, Documentation conventions

Comments in data files

A YAML or TOML file's comments are linted beside the fields its View selects, under the scopes a source file's comments carry, and a # inside a string is not a comment.

Docs: Data Views

Named scopes and metric variables

A scope can be written once in config/scopes/ and used by name in any rule, and doc(...) accepts Selectors Level 4, relative selectors in :has() included:

# styles/config/scopes/Methods.yml
scope: 'doc(section:has(> h2:contains("Methods")))'

A metric formula has the readability scores as variables, quote_words, sentence_length_sd, and round(). A quote scope reaches the text between quotation marks. A rule can carry its own tests:, and vale test --coverage lists the rules without any.

Docs: Named scopes, Selections, metric variables

The package version this Vale supports

vale sync installs the release of a package that the running Vale supports, from a releases manifest in its meta.json or from the package's release feed, so a style that uses a newer key never breaks an older Vale. Built-in rules honor [param] settings, and YES and NO read as booleans.

Docs: The version Vale supports

Formats

  • HTML: a page's <meta name="description"> is prose, <samp> is code, and a figure's caption and alt text are no longer skipped with the figure.
  • Org: #+TITLE: and #+AUTHOR: are prose, headline tags are not, and a footnote is reported where it is written.
  • QDoc: an \omit ... \endomit on one line ends there.
  • Plain text: a manuscript's chapters are headings, and metric rules see the file's summary.
  • MDX: a code fence after a one-line element stays out of the HTML block.

Changelog

  • 2753160f spelling: Read faster on large files, and read figures and inline QDoc omissions
  • 75c04b37 feat: Read a data file's comments beside its View, and a page's description
  • 0ea6b7a1 fix: Honor a code View's scope type, mask doc-comment conventions, drop directives, and read Org keywords and footnotes in place
  • 521deac8 fix: scalar settings reach the built-in rules, and YES and NO read as bools
  • f8a01426 fix(rst): run the spawned rst2html in Python's UTF-8 mode
  • f43fcfc5 docs: add discord
  • 062bf1dc fix(rst): read and write UTF-8 whatever the console's code page
  • 9a192397 feat: sync installs the release this Vale supports
  • 27fa279c fix: give a plain-text file a summary, so metric rules and ls-metrics see it
  • 62d4da8e fix: pool Docutils on Windows, where rst2html is a launcher with no shebang
  • b66f8276 fix(mdx): keep a code fence after a one-line element out of an HTML block (#1194)
  • 559bfe17 feat: one [sphinx] section for reStructuredText and MyST
  • e435dab9 fix: place a script rule's matches by the block they index, not the file
  • 33087fea feat: read a plain-text manuscript's chapters, and measure speech and pace
  • 6ba35ce8 feat: read the body of a directive Docutils does not know as prose
  • 459d3cda feat: Selectors Level 4 in doc(...)
  • 0cc85df7 feat: named scopes, readability variables, and test coverage
  • cea3fcdd fix: read a YAML file's comments through a tree-sitter View (#1188)
  • 706f8582 Merge branch 'pr-1192' into v3
  • 9bcf8d08 feat(code): add Kotlin comment extraction (#1183)
  • 4bd1bc25 fix: place a paragraph that opens with inline content at its own text (#1186)
  • b970c752 fix: place a match that wraps into an indented or quoted line (#1185)
  • b9f2ee29 fix: locate a match past a multi-byte mask (#1184) (#1193)
  • 123e3f98 chore(deps): bump github.com/tomwright/dasel/v3 from 3.10.1 to 3.11.2 (#1190)
  • 64d2aa2c ci: allow benchstat to select its required Go toolchain
  • 70f3c136 fix: place a summary-scoped alert on the prose it counted
  • 275cd4c7 fix: metric positions in sentence scope
  • cac1949c feat: allow metrics to report scoped locations
  • 90eaca41 fix: put a fragment file back before the raw scope runs (#1182)
  • ba6a2c6a feat: add a quote scope for the text between quotation marks
  • 520962ef fix: gather a leaf element's own text for a doc(...) selection on it
  • 0904d198 feat: accept a selector group at the top level of doc(...)
  • 86032fc9 fix: find a package directory whose case differs from the URL basename

@github-actions github-actions Bot added the skip-changeset PR intentionally ships no release note (bypasses the changeset requirement) label Sep 28, 2026

This branch has not been deployed

No deployments
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.

0 participants