Releases: vale-cli/vale
v3.15.1
v3.15.0
Vocabularies now support multi-word entries — phrases that are valid as a unit but whose individual words shouldn't be accepted on their own.
Previously, an accept.txt entry like mea culpa couldn't work: spell-checking splits text into single words, so mea and culpa were each checked (and flagged) separately. Your only option was accepting each word individually — which also silently allowed them everywhere else.
Now you can add the phrase directly:
mea culpa
mea culpais accepted as a phrase- a stray
meaorculpaon its own is still flagged
Changelog
- 948bd96 feat: support presence checks in conditional rules
- 4d281c3 fix: render occurrence count as a number
- 3b43f73 fix: preserve relative indentation in code-comment markup (#1028)
- 32cd425 fix: don't pad dashes adjacent to inline markup (#1029)
- fa67a3e feat: accept multi-word phrases in the vocabulary (#1035)
- 072ac4f fix: don't treat substitution replacements as regexes (#1038)
- d372163 fix: don't pad inline content adjacent to brackets (#1056)
- 2680b53 fix: don't apply word Vocab to nonword existence rules (#1058)
- 8558c4f fix: handle Danish-style hunspell dictionaries (#1065)
- 0da27dd fix: ignore generated TOC and section numbers in AsciiDoc (#1101)
- a686cae fix: don't require a python executable to lint reStructuredText (#1102)
- 813e6c8 fix: prevent crash when masking read-only context (#1099)
- c1533d1 fix: create configured StylesPath during sync (#1105) (#1106)
v3.14.2
Changelog
- 810868b chore: drop yaml v2
- 20fcb4d fix: move to gopkg.in/yaml.v3
- cdf6f9e Bugfix/path expansion (#1096)
- 3b9c8bf chore(deps): upgrade github.com/olekukonko/tablewriter from v0.0.5 to v1.1.4 (#1092)
- e251662 fix: add FLAG num support for agglutinative languages (#1090)
- 831ded9 chore: update clone path
- 806283c chore(deps): bump github.com/tomwright/dasel/v3 from 3.3.1 to 3.3.2 (#1088)
v3.14.1
v3.14.0
This release introduces support for Dasel v3, which is notably capable of performing predicate-based recursive search.
See Vale & The OpenAPI Specification [2026 update] for an example use case.
Changelog
v3.13.1
v3.13.0
v3.12.0
🚀 New Feature: Views – Targeted Linting for Structured (YAML, JSON, TOML) and Source Code Files
We’re introducing Views, a new way to define custom, structured representations of your files—giving you fine-grained control over what gets linted and how.
Views allow you to extract specific content from structured data (like YAML, JSON, or TOML) and source code and apply scoped linting rules to just those sections.
🔍 What’s a View?
A View is a user-defined configuration that transforms a file into a set of named scopes. This enables you to lint only relevant parts of a file—such as metadata descriptions, comments, or docstrings—without affecting the rest.
Here's an example using an OpenAPI file:
openapi: 3.0.0
info:
title: sample API
description: Optional multiline or single-line description in [CommonMark](http://commonmark.org/help/) or HTML.
version: 0.1.9
servers:
- url: http://api.example.com/v1
description: Optional server description, e.g. Main (production) serrver
- url: http://staging-api.example.com
description: |
Optional server description, e.g.
Internal staging serrver for testing
- url: http://api.example.com/v2
description: Optional server description, e.g. Main (production) serrverAnd here's a View that extracts title, description, and each server's description:
# config/views/OpenAPI.yml
engine: dasel
scopes:
- name: title
expr: info.title
- expr: info.description
type: md
- expr: servers.all().description
type: mdtype: md indicates that the description values are formatted are Markdown. We enable this be using the View key in our .vale.ini:
StylesPath = ../../styles
MinAlertLevel = suggestion
[API.yml]
BasedOnStyles = Vale
View = OpenAPISee the documentation for more information.