diff --git a/.github/workflows/vale-linter.yml b/.github/workflows/vale-linter.yml new file mode 100644 index 0000000000..366d318aac --- /dev/null +++ b/.github/workflows/vale-linter.yml @@ -0,0 +1,50 @@ +name: Vale Linter + +on: + pull_request: + types: [opened, edited, reopened, synchronize] + branches-ignore: + - main + paths: + - '**.md' + +jobs: + vale: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + checks: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 0 + + - name: Get changed markdown files + id: changed-files + run: | + BASE_SHA="${{ github.event.pull_request.base.sha }}" + HEAD_SHA="${{ github.event.pull_request.head.sha }}" + CHANGED_MD_FILES=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA $HEAD_SHA | grep '\.md$' || true) + if [ -z "$CHANGED_MD_FILES" ]; then + echo "No markdown files changed." + echo "files=" >> "$GITHUB_OUTPUT" + else + echo "Changed markdown files:" + echo "$CHANGED_MD_FILES" + FILES_JSON=$(echo "$CHANGED_MD_FILES" | jq -R -s -c 'split("\n") | map(select(length > 0))') + echo "files=$FILES_JSON" >> "$GITHUB_OUTPUT" + fi + + - name: Run Vale + if: steps.changed-files.outputs.files != '' + uses: errata-ai/vale-action@v2 + with: + files: ${{ steps.changed-files.outputs.files }} + reporter: github-pr-review + fail_on_error: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.vale.ini b/.vale.ini new file mode 100644 index 0000000000..b9115c3090 --- /dev/null +++ b/.vale.ini @@ -0,0 +1,5 @@ +StylesPath = .vale/styles +MinAlertLevel = suggestion + +[*.md] +BasedOnStyles = Netwrix diff --git a/.vale/styles/Netwrix/Aforementioned.yml b/.vale/styles/Netwrix/Aforementioned.yml new file mode 100644 index 0000000000..ba1464b5d4 --- /dev/null +++ b/.vale/styles/Netwrix/Aforementioned.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid 'aforementioned'. Refer to the subject directly or use 'described earlier'." +level: warning +ignorecase: true +nonword: true +tokens: + - '\baforementioned\b' diff --git a/.vale/styles/Netwrix/BoilerplateCrossRef.yml b/.vale/styles/Netwrix/BoilerplateCrossRef.yml new file mode 100644 index 0000000000..3c0416696a --- /dev/null +++ b/.vale/styles/Netwrix/BoilerplateCrossRef.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid '%s'. Write specific cross-reference text that describes what the reader will find." +level: suggestion +ignorecase: true +tokens: + - '\bfor additional information\b' + - '\bfor more information\b' diff --git a/.vale/styles/Netwrix/Checkbox.yml b/.vale/styles/Netwrix/Checkbox.yml new file mode 100644 index 0000000000..cfdad29c60 --- /dev/null +++ b/.vale/styles/Netwrix/Checkbox.yml @@ -0,0 +1,6 @@ +extends: substitution +message: "Use 'checkbox' (one word) instead of '%s'." +level: warning +ignorecase: true +swap: + '\bcheck box\b': 'checkbox' diff --git a/.vale/styles/Netwrix/CondescendingWords.yml b/.vale/styles/Netwrix/CondescendingWords.yml new file mode 100644 index 0000000000..cfd728407d --- /dev/null +++ b/.vale/styles/Netwrix/CondescendingWords.yml @@ -0,0 +1,11 @@ +extends: existence +message: "Avoid '%s'. Remove it or rewrite without language that minimizes task difficulty." +level: suggestion +ignorecase: true +nonword: true +tokens: + - '\bsimply\b' + - '\beasily\b' + - '\bjust\b' + - '\bbasically\b' + - '\bobviously\b' diff --git a/.vale/styles/Netwrix/Dropdown.yml b/.vale/styles/Netwrix/Dropdown.yml new file mode 100644 index 0000000000..0151b8f313 --- /dev/null +++ b/.vale/styles/Netwrix/Dropdown.yml @@ -0,0 +1,7 @@ +extends: substitution +message: "Use 'drop-down' (hyphenated) instead of '%s'." +level: warning +ignorecase: true +swap: + '\bdrop down\b': 'drop-down' + '\bdropdown\b': 'drop-down' diff --git a/.vale/styles/Netwrix/ExclamationPoints.yml b/.vale/styles/Netwrix/ExclamationPoints.yml new file mode 100644 index 0000000000..9334c48272 --- /dev/null +++ b/.vale/styles/Netwrix/ExclamationPoints.yml @@ -0,0 +1,5 @@ +extends: existence +message: "Avoid exclamation points in technical documentation." +level: warning +tokens: + - '!' diff --git a/.vale/styles/Netwrix/FirstPersonPlural.yml b/.vale/styles/Netwrix/FirstPersonPlural.yml new file mode 100644 index 0000000000..8c6c7677d3 --- /dev/null +++ b/.vale/styles/Netwrix/FirstPersonPlural.yml @@ -0,0 +1,9 @@ +extends: existence +message: "Avoid first person plural '%s'. Rewrite without 'we', 'our', 'us', or 'ours'." +level: warning +ignorecase: true +nonword: true +tokens: + - '\bwe\b' + - '\bour\b' + - '\bours\b' diff --git a/.vale/styles/Netwrix/FollowTheStepsTo.yml b/.vale/styles/Netwrix/FollowTheStepsTo.yml new file mode 100644 index 0000000000..b5dfbd51e3 --- /dev/null +++ b/.vale/styles/Netwrix/FollowTheStepsTo.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid '%s'. Use a direct heading and numbered list instead." +level: warning +ignorecase: true +tokens: + - '\bfollow the steps to\b' + - '\bfollow these steps to\b' diff --git a/.vale/styles/Netwrix/HitVsClick.yml b/.vale/styles/Netwrix/HitVsClick.yml new file mode 100644 index 0000000000..535b5ec0e6 --- /dev/null +++ b/.vale/styles/Netwrix/HitVsClick.yml @@ -0,0 +1,6 @@ +extends: substitution +message: "Use 'click' instead of 'hit' for UI elements." +level: suggestion +ignorecase: true +swap: + '\bhit\b': 'click' diff --git a/.vale/styles/Netwrix/ImpersonalConstructions.yml b/.vale/styles/Netwrix/ImpersonalConstructions.yml new file mode 100644 index 0000000000..c4884ef7b6 --- /dev/null +++ b/.vale/styles/Netwrix/ImpersonalConstructions.yml @@ -0,0 +1,13 @@ +extends: existence +message: "Avoid '%s'. Rewrite with an active subject or a direct imperative." +level: warning +ignorecase: true +tokens: + - '\bit is recommended\b' + - '\bit is necessary\b' + - '\bit is possible\b' + - '\bit is required\b' + - '\bit is advised\b' + - '\bit is suggested\b' + - '\bit is important\b' + - '\bit should be noted\b' diff --git a/.vale/styles/Netwrix/InOrderTo.yml b/.vale/styles/Netwrix/InOrderTo.yml new file mode 100644 index 0000000000..a026ffd49f --- /dev/null +++ b/.vale/styles/Netwrix/InOrderTo.yml @@ -0,0 +1,6 @@ +extends: substitution +message: "Use 'to' instead of '%s'." +level: warning +ignorecase: true +swap: + 'in order to': 'to' diff --git a/.vale/styles/Netwrix/IsAbleTo.yml b/.vale/styles/Netwrix/IsAbleTo.yml new file mode 100644 index 0000000000..611176cfa7 --- /dev/null +++ b/.vale/styles/Netwrix/IsAbleTo.yml @@ -0,0 +1,9 @@ +extends: substitution +message: "Use 'can' instead of '%s'." +level: warning +ignorecase: true +swap: + '\bis able to\b': 'can' + '\bare able to\b': 'can' + '\bwas able to\b': 'could' + '\bwere able to\b': 'could' diff --git a/.vale/styles/Netwrix/LatinAbbreviations.yml b/.vale/styles/Netwrix/LatinAbbreviations.yml new file mode 100644 index 0000000000..1813a613a6 --- /dev/null +++ b/.vale/styles/Netwrix/LatinAbbreviations.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Avoid Latin abbreviation '%s'. Use the English equivalent instead: 'for example', 'that is', or 'and so on'." +level: warning +ignorecase: false +tokens: + - '\be\.g\.' + - '\bi\.e\.' + - '\betc\.' diff --git a/.vale/styles/Netwrix/LoginVerb.yml b/.vale/styles/Netwrix/LoginVerb.yml new file mode 100644 index 0000000000..38ae43ecfa --- /dev/null +++ b/.vale/styles/Netwrix/LoginVerb.yml @@ -0,0 +1,6 @@ +extends: substitution +message: "Use 'log in' (two words) as a verb instead of '%s'." +level: warning +ignorecase: true +swap: + '\blogin to\b': 'log in to' diff --git a/.vale/styles/Netwrix/MakeSure.yml b/.vale/styles/Netwrix/MakeSure.yml new file mode 100644 index 0000000000..2aec6aeb9f --- /dev/null +++ b/.vale/styles/Netwrix/MakeSure.yml @@ -0,0 +1,6 @@ +extends: substitution +message: "Use 'ensure' instead of '%s'." +level: warning +ignorecase: true +swap: + '\bmake sure\b': 'ensure' diff --git a/.vale/styles/Netwrix/May.yml b/.vale/styles/Netwrix/May.yml new file mode 100644 index 0000000000..5e2b6d871f --- /dev/null +++ b/.vale/styles/Netwrix/May.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid 'may'. Use 'might' for possibility or 'can' for capability." +level: suggestion +ignorecase: false +nonword: true +tokens: + - '\bmay\b' diff --git a/.vale/styles/Netwrix/NegativeAssumptions.yml b/.vale/styles/Netwrix/NegativeAssumptions.yml new file mode 100644 index 0000000000..e085459449 --- /dev/null +++ b/.vale/styles/Netwrix/NegativeAssumptions.yml @@ -0,0 +1,14 @@ +extends: existence +message: "Avoid negative assumptions about what users can or cannot do ('%s'). Describe the benefit positively instead." +level: warning +ignorecase: true +tokens: + - '\byou wouldn''t be able to\b' + - '\byou would not be able to\b' + - '\byou won''t be able to\b' + - '\byou will not be able to\b' + - '\byou are unable to\b' + - '\byou aren''t able to\b' + - '\byou are not able to\b' + - '\byou could not\b' + - '\byou couldn''t\b' diff --git a/.vale/styles/Netwrix/NoteThat.yml b/.vale/styles/Netwrix/NoteThat.yml new file mode 100644 index 0000000000..389511d87e --- /dev/null +++ b/.vale/styles/Netwrix/NoteThat.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid '%s'. Use a proper admonition block (Note, Warning, or Tip) for supplementary information." +level: warning +ignorecase: true +tokens: + - '\bnote that\b' + - '\bplease note\b' diff --git a/.vale/styles/Netwrix/Please.yml b/.vale/styles/Netwrix/Please.yml new file mode 100644 index 0000000000..48f370a86f --- /dev/null +++ b/.vale/styles/Netwrix/Please.yml @@ -0,0 +1,7 @@ +extends: existence +message: "Avoid 'please' in instructions. Be direct." +level: warning +ignorecase: true +nonword: true +tokens: + - '\bplease\b' diff --git a/.vale/styles/Netwrix/ProvidesAbilityTo.yml b/.vale/styles/Netwrix/ProvidesAbilityTo.yml new file mode 100644 index 0000000000..6eefb213cf --- /dev/null +++ b/.vale/styles/Netwrix/ProvidesAbilityTo.yml @@ -0,0 +1,8 @@ +extends: substitution +message: "Use 'lets you' or 'can' instead of '%s'." +level: warning +ignorecase: true +swap: + '\bprovides the ability to\b': 'lets you' + '\bprovide the ability to\b': 'let you' + '\bprovided the ability to\b': 'let you' diff --git a/.vale/styles/Netwrix/Repetition.yml b/.vale/styles/Netwrix/Repetition.yml new file mode 100644 index 0000000000..d803080777 --- /dev/null +++ b/.vale/styles/Netwrix/Repetition.yml @@ -0,0 +1,6 @@ +extends: repetition +message: "Repeated word '%s' detected." +level: warning +alpha: true +tokens: + - '[^\s]+' diff --git a/.vale/styles/Netwrix/SentenceLength.yml b/.vale/styles/Netwrix/SentenceLength.yml new file mode 100644 index 0000000000..d66114778e --- /dev/null +++ b/.vale/styles/Netwrix/SentenceLength.yml @@ -0,0 +1,7 @@ +extends: metric +message: "Sentences should be 25 words or fewer. This sentence has %d words." +level: suggestion +scope: sentence +metric: words +condition: '>' +limit: 25 diff --git a/.vale/styles/Netwrix/TypeVsEnter.yml b/.vale/styles/Netwrix/TypeVsEnter.yml new file mode 100644 index 0000000000..39eccde879 --- /dev/null +++ b/.vale/styles/Netwrix/TypeVsEnter.yml @@ -0,0 +1,10 @@ +extends: existence +message: "Use 'enter' instead of 'type' when instructing users to input text into a field." +level: suggestion +ignorecase: true +tokens: + - '\btype your\b' + - '\btype the\b' + - '\btype in\b' + - '\btype a\b' + - '\btype an\b' diff --git a/.vale/styles/Netwrix/Utilize.yml b/.vale/styles/Netwrix/Utilize.yml new file mode 100644 index 0000000000..40558aa1ac --- /dev/null +++ b/.vale/styles/Netwrix/Utilize.yml @@ -0,0 +1,13 @@ +extends: substitution +message: "Use 'use' instead of '%s'." +level: warning +ignorecase: true +swap: + '\butilizes\b': 'uses' + '\butilized\b': 'used' + '\butilizing\b': 'using' + '\butilize\b': 'use' + '\butilises\b': 'uses' + '\butilised\b': 'used' + '\butilising\b': 'using' + '\butilise\b': 'use' diff --git a/.vale/styles/Netwrix/WeakLinkText.yml b/.vale/styles/Netwrix/WeakLinkText.yml new file mode 100644 index 0000000000..517ad881e7 --- /dev/null +++ b/.vale/styles/Netwrix/WeakLinkText.yml @@ -0,0 +1,10 @@ +extends: existence +message: "Avoid generic link text '%s'. Write descriptive link text that describes the destination or action." +level: warning +ignorecase: true +tokens: + - '\bclick here\b' + - '\bthis link\b' + - '\blearn more\b' + - '\bsee more\b' + - '\bread more\b' diff --git a/.vale/styles/Netwrix/WishTo.yml b/.vale/styles/Netwrix/WishTo.yml new file mode 100644 index 0000000000..cbbdcf5237 --- /dev/null +++ b/.vale/styles/Netwrix/WishTo.yml @@ -0,0 +1,6 @@ +extends: substitution +message: "Use 'want to' instead of '%s', or rewrite as a direct imperative." +level: suggestion +ignorecase: true +swap: + '\bwish to\b': 'want to' diff --git a/.vale/styles/Netwrix/WordyPhrases.yml b/.vale/styles/Netwrix/WordyPhrases.yml new file mode 100644 index 0000000000..dfe0b1714a --- /dev/null +++ b/.vale/styles/Netwrix/WordyPhrases.yml @@ -0,0 +1,9 @@ +extends: substitution +message: "Use a concise alternative instead of '%s'." +level: warning +ignorecase: true +swap: + '\bprior to\b': 'before' + '\bsubsequent to\b': 'after' + '\bin the event that\b': 'if' + '\bdue to the fact that\b': 'because'