From ffe30c5006fd9382c9a585534da4d7777867f429 Mon Sep 17 00:00:00 2001
From: Andrej Shadura <andrew.shadura@collabora.co.uk>
Date: Sat, 27 Feb 2021 19:52:06 +0100
Subject: [PATCH] WIP: Run the content through Vale

Signed-off-by: Andrej Shadura <andrew.shadura@collabora.co.uk>
---
 .gitlab-ci.yml                        |  32 ++
 .vale/styles/Vocab/Apertis/accept.txt |  34 ++
 .vale/styles/vocab.txt                |  31 ++
 .vale/styles/write-good/Cliches.yml   | 702 ++++++++++++++++++++++++++
 .vale/styles/write-good/E-Prime.yml   |  32 ++
 .vale/styles/write-good/Illusions.yml |  11 +
 .vale/styles/write-good/Passive.yml   | 183 +++++++
 .vale/styles/write-good/README.md     |  27 +
 .vale/styles/write-good/So.yml        |   5 +
 .vale/styles/write-good/ThereIs.yml   |   6 +
 .vale/styles/write-good/TooWordy.yml  | 221 ++++++++
 .vale/styles/write-good/Weasel.yml    | 207 ++++++++
 .vale/styles/write-good/meta.json     |   4 +
 .vale/vale.d/concepts.ini             |  12 +
 .vale/vale.ini                        |  18 +
 scripts/vale-to-codeclimate           |  33 ++
 16 files changed, 1558 insertions(+)
 create mode 100644 .vale/styles/Vocab/Apertis/accept.txt
 create mode 100644 .vale/styles/vocab.txt
 create mode 100644 .vale/styles/write-good/Cliches.yml
 create mode 100644 .vale/styles/write-good/E-Prime.yml
 create mode 100644 .vale/styles/write-good/Illusions.yml
 create mode 100644 .vale/styles/write-good/Passive.yml
 create mode 100644 .vale/styles/write-good/README.md
 create mode 100644 .vale/styles/write-good/So.yml
 create mode 100644 .vale/styles/write-good/ThereIs.yml
 create mode 100644 .vale/styles/write-good/TooWordy.yml
 create mode 100644 .vale/styles/write-good/Weasel.yml
 create mode 100644 .vale/styles/write-good/meta.json
 create mode 100644 .vale/vale.d/concepts.ini
 create mode 100644 .vale/vale.ini
 create mode 100755 scripts/vale-to-codeclimate

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3ef584b9b..81379393c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,6 +10,38 @@ variables:
 stages:
   - generate-html
   - generate-pdf
+  - stylecheck
+
+vale-stylecheck:
+  image:
+    name: jdkato/vale
+    entrypoint: [""]
+  stage: stylecheck
+  needs: []
+  tags:
+    - lightweight
+  script:
+  - apk add jq
+  - |
+    for d in content/*/
+    do
+        config=.vale/vale.ini
+        n="$(basename ${d%/})"
+        # release notes have a list of issues often with typos in them
+        test "$n" != release || continue
+        # select the appropriate config, if needed
+        test ! -f ".vale/vale.d/$n.ini" || config=.vale/vale.d/$n.ini
+        echo Linting $n
+        vale --no-exit --config="$config" $d
+        vale --no-exit --config="$config" --output=JSON $d > output-$n.json
+    done
+    echo Merging and converting reports into Code Climate format
+    scripts/vale-to-codeclimate output-*.json > report.json
+  artifacts:
+    reports:
+      codequality: report.json
+    paths:
+      - output-*.json
 
 test-html:
   image: registry.gitlab.com/pages/hugo:0.62.2
diff --git a/.vale/styles/Vocab/Apertis/accept.txt b/.vale/styles/Vocab/Apertis/accept.txt
new file mode 100644
index 000000000..5c0039ce0
--- /dev/null
+++ b/.vale/styles/Vocab/Apertis/accept.txt
@@ -0,0 +1,34 @@
+ATF
+Apertis
+Flatpaks?
+GPL
+GitLab
+GlobalPlatform
+HMI
+HTML
+HiKey
+IPAs
+KVM
+LFS
+MX
+OpenSSL
+PDFs?
+REE
+RK
+Renesas
+Rockchip
+SDK
+SMC
+SoC
+TAs
+TEEs?
+TPM
+TrustZone
+UI
+UUID
+VMs?
+VirtualBox
+WIP
+Xen
+YAML
+OSpack
diff --git a/.vale/styles/vocab.txt b/.vale/styles/vocab.txt
new file mode 100644
index 000000000..10a448dfd
--- /dev/null
+++ b/.vale/styles/vocab.txt
@@ -0,0 +1,31 @@
+architected
+backport
+backported
+bootloader
+bootloaders
+coprocessor
+cryptographic
+deduplicate
+deduplicated
+deployable
+devkit
+devroot
+downstream
+downstreams
+hotfix
+namespace
+prebuilt
+proxied
+proxying
+rebase
+reproducibility
+runtime
+shortcode
+snapshotted
+snapshotting
+submitters
+sysroot
+topologies
+untrusted
+upstreamed
+virtualized
diff --git a/.vale/styles/write-good/Cliches.yml b/.vale/styles/write-good/Cliches.yml
new file mode 100644
index 000000000..c95314387
--- /dev/null
+++ b/.vale/styles/write-good/Cliches.yml
@@ -0,0 +1,702 @@
+extends: existence
+message: "Try to avoid using clichés like '%s'."
+ignorecase: true
+level: warning
+tokens:
+  - a chip off the old block
+  - a clean slate
+  - a dark and stormy night
+  - a far cry
+  - a fine kettle of fish
+  - a loose cannon
+  - a penny saved is a penny earned
+  - a tough row to hoe
+  - a word to the wise
+  - ace in the hole
+  - acid test
+  - add insult to injury
+  - against all odds
+  - air your dirty laundry
+  - all fun and games
+  - all in a day's work
+  - all talk, no action
+  - all thumbs
+  - all your eggs in one basket
+  - all's fair in love and war
+  - all's well that ends well
+  - almighty dollar
+  - American as apple pie
+  - an axe to grind
+  - another day, another dollar
+  - armed to the teeth
+  - as luck would have it
+  - as old as time
+  - as the crow flies
+  - at loose ends
+  - at my wits end
+  - avoid like the plague
+  - babe in the woods
+  - back against the wall
+  - back in the saddle
+  - back to square one
+  - back to the drawing board
+  - bad to the bone
+  - badge of honor
+  - bald faced liar
+  - ballpark figure
+  - banging your head against a brick wall
+  - baptism by fire
+  - barking up the wrong tree
+  - bat out of hell
+  - be all and end all
+  - beat a dead horse
+  - beat around the bush
+  - been there, done that
+  - beggars can't be choosers
+  - behind the eight ball
+  - bend over backwards
+  - benefit of the doubt
+  - bent out of shape
+  - best thing since sliced bread
+  - bet your bottom dollar
+  - better half
+  - better late than never
+  - better mousetrap
+  - better safe than sorry
+  - between a rock and a hard place
+  - beyond the pale
+  - bide your time
+  - big as life
+  - big cheese
+  - big fish in a small pond
+  - big man on campus
+  - bigger they are the harder they fall
+  - bird in the hand
+  - bird's eye view
+  - birds and the bees
+  - birds of a feather flock together
+  - bit the hand that feeds you
+  - bite the bullet
+  - bite the dust
+  - bitten off more than he can chew
+  - black as coal
+  - black as pitch
+  - black as the ace of spades
+  - blast from the past
+  - bleeding heart
+  - blessing in disguise
+  - blind ambition
+  - blind as a bat
+  - blind leading the blind
+  - blood is thicker than water
+  - blood sweat and tears
+  - blow off steam
+  - blow your own horn
+  - blushing bride
+  - boils down to
+  - bolt from the blue
+  - bone to pick
+  - bored stiff
+  - bored to tears
+  - bottomless pit
+  - boys will be boys
+  - bright and early
+  - brings home the bacon
+  - broad across the beam
+  - broken record
+  - brought back to reality
+  - bull by the horns
+  - bull in a china shop
+  - burn the midnight oil
+  - burning question
+  - burning the candle at both ends
+  - burst your bubble
+  - bury the hatchet
+  - busy as a bee
+  - by hook or by crook
+  - call a spade a spade
+  - called onto the carpet
+  - calm before the storm
+  - can of worms
+  - can't cut the mustard
+  - can't hold a candle to
+  - case of mistaken identity
+  - cat got your tongue
+  - cat's meow
+  - caught in the crossfire
+  - caught red-handed
+  - checkered past
+  - chomping at the bit
+  - cleanliness is next to godliness
+  - clear as a bell
+  - clear as mud
+  - close to the vest
+  - cock and bull story
+  - cold shoulder
+  - come hell or high water
+  - cool as a cucumber
+  - cool, calm, and collected
+  - cost a king's ransom
+  - count your blessings
+  - crack of dawn
+  - crash course
+  - creature comforts
+  - cross that bridge when you come to it
+  - crushing blow
+  - cry like a baby
+  - cry me a river
+  - cry over spilt milk
+  - crystal clear
+  - curiosity killed the cat
+  - cut and dried
+  - cut through the red tape
+  - cut to the chase
+  - cute as a bugs ear
+  - cute as a button
+  - cute as a puppy
+  - cuts to the quick
+  - dark before the dawn
+  - day in, day out
+  - dead as a doornail
+  - devil is in the details
+  - dime a dozen
+  - divide and conquer
+  - dog and pony show
+  - dog days
+  - dog eat dog
+  - dog tired
+  - don't burn your bridges
+  - don't count your chickens
+  - don't look a gift horse in the mouth
+  - don't rock the boat
+  - don't step on anyone's toes
+  - don't take any wooden nickels
+  - down and out
+  - down at the heels
+  - down in the dumps
+  - down the hatch
+  - down to earth
+  - draw the line
+  - dressed to kill
+  - dressed to the nines
+  - drives me up the wall
+  - dull as dishwater
+  - dyed in the wool
+  - eagle eye
+  - ear to the ground
+  - early bird catches the worm
+  - easier said than done
+  - easy as pie
+  - eat your heart out
+  - eat your words
+  - eleventh hour
+  - even the playing field
+  - every dog has its day
+  - every fiber of my being
+  - everything but the kitchen sink
+  - eye for an eye
+  - face the music
+  - facts of life
+  - fair weather friend
+  - fall by the wayside
+  - fan the flames
+  - feast or famine
+  - feather your nest
+  - feathered friends
+  - few and far between
+  - fifteen minutes of fame
+  - filthy vermin
+  - fine kettle of fish
+  - fish out of water
+  - fishing for a compliment
+  - fit as a fiddle
+  - fit the bill
+  - fit to be tied
+  - flash in the pan
+  - flat as a pancake
+  - flip your lid
+  - flog a dead horse
+  - fly by night
+  - fly the coop
+  - follow your heart
+  - for all intents and purposes
+  - for the birds
+  - for what it's worth
+  - force of nature
+  - force to be reckoned with
+  - forgive and forget
+  - fox in the henhouse
+  - free and easy
+  - free as a bird
+  - fresh as a daisy
+  - full steam ahead
+  - fun in the sun
+  - garbage in, garbage out
+  - gentle as a lamb
+  - get a kick out of
+  - get a leg up
+  - get down and dirty
+  - get the lead out
+  - get to the bottom of
+  - get your feet wet
+  - gets my goat
+  - gilding the lily
+  - give and take
+  - go against the grain
+  - go at it tooth and nail
+  - go for broke
+  - go him one better
+  - go the extra mile
+  - go with the flow
+  - goes without saying
+  - good as gold
+  - good deed for the day
+  - good things come to those who wait
+  - good time was had by all
+  - good times were had by all
+  - greased lightning
+  - greek to me
+  - green thumb
+  - green-eyed monster
+  - grist for the mill
+  - growing like a weed
+  - hair of the dog
+  - hand to mouth
+  - happy as a clam
+  - happy as a lark
+  - hasn't a clue
+  - have a nice day
+  - have high hopes
+  - have the last laugh
+  - haven't got a row to hoe
+  - head honcho
+  - head over heels
+  - hear a pin drop
+  - heard it through the grapevine
+  - heart's content
+  - heavy as lead
+  - hem and haw
+  - high and dry
+  - high and mighty
+  - high as a kite
+  - hit paydirt
+  - hold your head up high
+  - hold your horses
+  - hold your own
+  - hold your tongue
+  - honest as the day is long
+  - horns of a dilemma
+  - horse of a different color
+  - hot under the collar
+  - hour of need
+  - I beg to differ
+  - icing on the cake
+  - if the shoe fits
+  - if the shoe were on the other foot
+  - in a jam
+  - in a jiffy
+  - in a nutshell
+  - in a pig's eye
+  - in a pinch
+  - in a word
+  - in hot water
+  - in the gutter
+  - in the nick of time
+  - in the thick of it
+  - in your dreams
+  - it ain't over till the fat lady sings
+  - it goes without saying
+  - it takes all kinds
+  - it takes one to know one
+  - it's a small world
+  - it's only a matter of time
+  - ivory tower
+  - Jack of all trades
+  - jockey for position
+  - jog your memory
+  - joined at the hip
+  - judge a book by its cover
+  - jump down your throat
+  - jump in with both feet
+  - jump on the bandwagon
+  - jump the gun
+  - jump to conclusions
+  - just a hop, skip, and a jump
+  - just the ticket
+  - justice is blind
+  - keep a stiff upper lip
+  - keep an eye on
+  - keep it simple, stupid
+  - keep the home fires burning
+  - keep up with the Joneses
+  - keep your chin up
+  - keep your fingers crossed
+  - kick the bucket
+  - kick up your heels
+  - kick your feet up
+  - kid in a candy store
+  - kill two birds with one stone
+  - kiss of death
+  - knock it out of the park
+  - knock on wood
+  - knock your socks off
+  - know him from Adam
+  - know the ropes
+  - know the score
+  - knuckle down
+  - knuckle sandwich
+  - knuckle under
+  - labor of love
+  - ladder of success
+  - land on your feet
+  - lap of luxury
+  - last but not least
+  - last hurrah
+  - last-ditch effort
+  - law of the jungle
+  - law of the land
+  - lay down the law
+  - leaps and bounds
+  - let sleeping dogs lie
+  - let the cat out of the bag
+  - let the good times roll
+  - let your hair down
+  - let's talk turkey
+  - letter perfect
+  - lick your wounds
+  - lies like a rug
+  - life's a bitch
+  - life's a grind
+  - light at the end of the tunnel
+  - lighter than a feather
+  - lighter than air
+  - like clockwork
+  - like father like son
+  - like taking candy from a baby
+  - like there's no tomorrow
+  - lion's share
+  - live and learn
+  - live and let live
+  - long and short of it
+  - long lost love
+  - look before you leap
+  - look down your nose
+  - look what the cat dragged in
+  - looking a gift horse in the mouth
+  - looks like death warmed over
+  - loose cannon
+  - lose your head
+  - lose your temper
+  - loud as a horn
+  - lounge lizard
+  - loved and lost
+  - low man on the totem pole
+  - luck of the draw
+  - luck of the Irish
+  - make hay while the sun shines
+  - make money hand over fist
+  - make my day
+  - make the best of a bad situation
+  - make the best of it
+  - make your blood boil
+  - man of few words
+  - man's best friend
+  - mark my words
+  - meaningful dialogue
+  - missed the boat on that one
+  - moment in the sun
+  - moment of glory
+  - moment of truth
+  - money to burn
+  - more power to you
+  - more than one way to skin a cat
+  - movers and shakers
+  - moving experience
+  - naked as a jaybird
+  - naked truth
+  - neat as a pin
+  - needle in a haystack
+  - needless to say
+  - neither here nor there
+  - never look back
+  - never say never
+  - nip and tuck
+  - nip it in the bud
+  - no guts, no glory
+  - no love lost
+  - no pain, no gain
+  - no skin off my back
+  - no stone unturned
+  - no time like the present
+  - no use crying over spilled milk
+  - nose to the grindstone
+  - not a hope in hell
+  - not a minute's peace
+  - not in my backyard
+  - not playing with a full deck
+  - not the end of the world
+  - not written in stone
+  - nothing to sneeze at
+  - nothing ventured nothing gained
+  - now we're cooking
+  - off the top of my head
+  - off the wagon
+  - off the wall
+  - old hat
+  - older and wiser
+  - older than dirt
+  - older than Methuselah
+  - on a roll
+  - on cloud nine
+  - on pins and needles
+  - on the bandwagon
+  - on the money
+  - on the nose
+  - on the rocks
+  - on the spot
+  - on the tip of my tongue
+  - on the wagon
+  - on thin ice
+  - once bitten, twice shy
+  - one bad apple doesn't spoil the bushel
+  - one born every minute
+  - one brick short
+  - one foot in the grave
+  - one in a million
+  - one red cent
+  - only game in town
+  - open a can of worms
+  - open and shut case
+  - open the flood gates
+  - opportunity doesn't knock twice
+  - out of pocket
+  - out of sight, out of mind
+  - out of the frying pan into the fire
+  - out of the woods
+  - out on a limb
+  - over a barrel
+  - over the hump
+  - pain and suffering
+  - pain in the
+  - panic button
+  - par for the course
+  - part and parcel
+  - party pooper
+  - pass the buck
+  - patience is a virtue
+  - pay through the nose
+  - penny pincher
+  - perfect storm
+  - pig in a poke
+  - pile it on
+  - pillar of the community
+  - pin your hopes on
+  - pitter patter of little feet
+  - plain as day
+  - plain as the nose on your face
+  - play by the rules
+  - play your cards right
+  - playing the field
+  - playing with fire
+  - pleased as punch
+  - plenty of fish in the sea
+  - point with pride
+  - poor as a church mouse
+  - pot calling the kettle black
+  - pretty as a picture
+  - pull a fast one
+  - pull your punches
+  - pulling your leg
+  - pure as the driven snow
+  - put it in a nutshell
+  - put one over on you
+  - put the cart before the horse
+  - put the pedal to the metal
+  - put your best foot forward
+  - put your foot down
+  - quick as a bunny
+  - quick as a lick
+  - quick as a wink
+  - quick as lightning
+  - quiet as a dormouse
+  - rags to riches
+  - raining buckets
+  - raining cats and dogs
+  - rank and file
+  - rat race
+  - reap what you sow
+  - red as a beet
+  - red herring
+  - reinvent the wheel
+  - rich and famous
+  - rings a bell
+  - ripe old age
+  - ripped me off
+  - rise and shine
+  - road to hell is paved with good intentions
+  - rob Peter to pay Paul
+  - roll over in the grave
+  - rub the wrong way
+  - ruled the roost
+  - running in circles
+  - sad but true
+  - sadder but wiser
+  - salt of the earth
+  - scared stiff
+  - scared to death
+  - sealed with a kiss
+  - second to none
+  - see eye to eye
+  - seen the light
+  - seize the day
+  - set the record straight
+  - set the world on fire
+  - set your teeth on edge
+  - sharp as a tack
+  - shoot for the moon
+  - shoot the breeze
+  - shot in the dark
+  - shoulder to the wheel
+  - sick as a dog
+  - sigh of relief
+  - signed, sealed, and delivered
+  - sink or swim
+  - six of one, half a dozen of another
+  - skating on thin ice
+  - slept like a log
+  - slinging mud
+  - slippery as an eel
+  - slow as molasses
+  - smart as a whip
+  - smooth as a baby's bottom
+  - sneaking suspicion
+  - snug as a bug in a rug
+  - sow wild oats
+  - spare the rod, spoil the child
+  - speak of the devil
+  - spilled the beans
+  - spinning your wheels
+  - spitting image of
+  - spoke with relish
+  - spread like wildfire
+  - spring to life
+  - squeaky wheel gets the grease
+  - stands out like a sore thumb
+  - start from scratch
+  - stick in the mud
+  - still waters run deep
+  - stitch in time
+  - stop and smell the roses
+  - straight as an arrow
+  - straw that broke the camel's back
+  - strong as an ox
+  - stubborn as a mule
+  - stuff that dreams are made of
+  - stuffed shirt
+  - sweating blood
+  - sweating bullets
+  - take a load off
+  - take one for the team
+  - take the bait
+  - take the bull by the horns
+  - take the plunge
+  - takes one to know one
+  - takes two to tango
+  - the more the merrier
+  - the real deal
+  - the real McCoy
+  - the red carpet treatment
+  - the same old story
+  - there is no accounting for taste
+  - thick as a brick
+  - thick as thieves
+  - thin as a rail
+  - think outside of the box
+  - third time's the charm
+  - this day and age
+  - this hurts me worse than it hurts you
+  - this point in time
+  - three sheets to the wind
+  - through thick and thin
+  - throw in the towel
+  - tie one on
+  - tighter than a drum
+  - time and time again
+  - time is of the essence
+  - tip of the iceberg
+  - tired but happy
+  - to coin a phrase
+  - to each his own
+  - to make a long story short
+  - to the best of my knowledge
+  - toe the line
+  - tongue in cheek
+  - too good to be true
+  - too hot to handle
+  - too numerous to mention
+  - touch with a ten foot pole
+  - tough as nails
+  - trial and error
+  - trials and tribulations
+  - tried and true
+  - trip down memory lane
+  - twist of fate
+  - two cents worth
+  - two peas in a pod
+  - ugly as sin
+  - under the counter
+  - under the gun
+  - under the same roof
+  - under the weather
+  - until the cows come home
+  - unvarnished truth
+  - up the creek
+  - uphill battle
+  - upper crust
+  - upset the applecart
+  - vain attempt
+  - vain effort
+  - vanquish the enemy
+  - vested interest
+  - waiting for the other shoe to drop
+  - wakeup call
+  - warm welcome
+  - watch your p's and q's
+  - watch your tongue
+  - watching the clock
+  - water under the bridge
+  - weather the storm
+  - weed them out
+  - week of Sundays
+  - went belly up
+  - wet behind the ears
+  - what goes around comes around
+  - what you see is what you get
+  - when it rains, it pours
+  - when push comes to shove
+  - when the cat's away
+  - when the going gets tough, the tough get going
+  - white as a sheet
+  - whole ball of wax
+  - whole hog
+  - whole nine yards
+  - wild goose chase
+  - will wonders never cease?
+  - wisdom of the ages
+  - wise as an owl
+  - wolf at the door
+  - words fail me
+  - work like a dog
+  - world weary
+  - worst nightmare
+  - worth its weight in gold
+  - wrong side of the bed
+  - yanking your chain
+  - yappy as a dog
+  - years young
+  - you are what you eat
+  - you can run but you can't hide
+  - you only live once
+  - you're the boss
+  - young and foolish
+  - young and vibrant
diff --git a/.vale/styles/write-good/E-Prime.yml b/.vale/styles/write-good/E-Prime.yml
new file mode 100644
index 000000000..074a102b2
--- /dev/null
+++ b/.vale/styles/write-good/E-Prime.yml
@@ -0,0 +1,32 @@
+extends: existence
+message: "Try to avoid using '%s'."
+ignorecase: true
+level: suggestion
+tokens:
+  - am
+  - are
+  - aren't
+  - be
+  - been
+  - being
+  - he's
+  - here's
+  - here's
+  - how's
+  - i'm
+  - is
+  - isn't
+  - it's
+  - she's
+  - that's
+  - there's
+  - they're
+  - was
+  - wasn't
+  - we're
+  - were
+  - weren't
+  - what's
+  - where's
+  - who's
+  - you're
diff --git a/.vale/styles/write-good/Illusions.yml b/.vale/styles/write-good/Illusions.yml
new file mode 100644
index 000000000..b4f132185
--- /dev/null
+++ b/.vale/styles/write-good/Illusions.yml
@@ -0,0 +1,11 @@
+extends: repetition
+message: "'%s' is repeated!"
+level: warning
+alpha: true
+action:
+  name: edit
+  params:
+    - truncate
+    - " "
+tokens:
+  - '[^\s]+'
diff --git a/.vale/styles/write-good/Passive.yml b/.vale/styles/write-good/Passive.yml
new file mode 100644
index 000000000..f472cb904
--- /dev/null
+++ b/.vale/styles/write-good/Passive.yml
@@ -0,0 +1,183 @@
+extends: existence
+message: "'%s' may be passive voice. Use active voice if you can."
+ignorecase: true
+level: warning
+raw:
+  - \b(am|are|were|being|is|been|was|be)\b\s*
+tokens:
+  - '[\w]+ed'
+  - awoken
+  - beat
+  - become
+  - been
+  - begun
+  - bent
+  - beset
+  - bet
+  - bid
+  - bidden
+  - bitten
+  - bled
+  - blown
+  - born
+  - bought
+  - bound
+  - bred
+  - broadcast
+  - broken
+  - brought
+  - built
+  - burnt
+  - burst
+  - cast
+  - caught
+  - chosen
+  - clung
+  - come
+  - cost
+  - crept
+  - cut
+  - dealt
+  - dived
+  - done
+  - drawn
+  - dreamt
+  - driven
+  - drunk
+  - dug
+  - eaten
+  - fallen
+  - fed
+  - felt
+  - fit
+  - fled
+  - flown
+  - flung
+  - forbidden
+  - foregone
+  - forgiven
+  - forgotten
+  - forsaken
+  - fought
+  - found
+  - frozen
+  - given
+  - gone
+  - gotten
+  - ground
+  - grown
+  - heard
+  - held
+  - hidden
+  - hit
+  - hung
+  - hurt
+  - kept
+  - knelt
+  - knit
+  - known
+  - laid
+  - lain
+  - leapt
+  - learnt
+  - led
+  - left
+  - lent
+  - let
+  - lighted
+  - lost
+  - made
+  - meant
+  - met
+  - misspelt
+  - mistaken
+  - mown
+  - overcome
+  - overdone
+  - overtaken
+  - overthrown
+  - paid
+  - pled
+  - proven
+  - put
+  - quit
+  - read
+  - rid
+  - ridden
+  - risen
+  - run
+  - rung
+  - said
+  - sat
+  - sawn
+  - seen
+  - sent
+  - set
+  - sewn
+  - shaken
+  - shaven
+  - shed
+  - shod
+  - shone
+  - shorn
+  - shot
+  - shown
+  - shrunk
+  - shut
+  - slain
+  - slept
+  - slid
+  - slit
+  - slung
+  - smitten
+  - sold
+  - sought
+  - sown
+  - sped
+  - spent
+  - spilt
+  - spit
+  - split
+  - spoken
+  - spread
+  - sprung
+  - spun
+  - stolen
+  - stood
+  - stridden
+  - striven
+  - struck
+  - strung
+  - stuck
+  - stung
+  - stunk
+  - sung
+  - sunk
+  - swept
+  - swollen
+  - sworn
+  - swum
+  - swung
+  - taken
+  - taught
+  - thought
+  - thrived
+  - thrown
+  - thrust
+  - told
+  - torn
+  - trodden
+  - understood
+  - upheld
+  - upset
+  - wed
+  - wept
+  - withheld
+  - withstood
+  - woken
+  - won
+  - worn
+  - wound
+  - woven
+  - written
+  - wrung
diff --git a/.vale/styles/write-good/README.md b/.vale/styles/write-good/README.md
new file mode 100644
index 000000000..3edcc9b37
--- /dev/null
+++ b/.vale/styles/write-good/README.md
@@ -0,0 +1,27 @@
+Based on [write-good](https://github.com/btford/write-good).
+
+> Naive linter for English prose for developers who can't write good and wanna learn to do other stuff good too.
+
+```
+The MIT License (MIT)
+
+Copyright (c) 2014 Brian Ford
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
diff --git a/.vale/styles/write-good/So.yml b/.vale/styles/write-good/So.yml
new file mode 100644
index 000000000..e57f099dc
--- /dev/null
+++ b/.vale/styles/write-good/So.yml
@@ -0,0 +1,5 @@
+extends: existence
+message: "Don't start a sentence with '%s'."
+level: error
+raw:
+  - '(?:[;-]\s)so[\s,]|\bSo[\s,]'
diff --git a/.vale/styles/write-good/ThereIs.yml b/.vale/styles/write-good/ThereIs.yml
new file mode 100644
index 000000000..8b82e8f6c
--- /dev/null
+++ b/.vale/styles/write-good/ThereIs.yml
@@ -0,0 +1,6 @@
+extends: existence
+message: "Don't start a sentence with '%s'."
+ignorecase: false
+level: error
+raw:
+  - '(?:[;-]\s)There\s(is|are)|\bThere\s(is|are)\b'
diff --git a/.vale/styles/write-good/TooWordy.yml b/.vale/styles/write-good/TooWordy.yml
new file mode 100644
index 000000000..275701b19
--- /dev/null
+++ b/.vale/styles/write-good/TooWordy.yml
@@ -0,0 +1,221 @@
+extends: existence
+message: "'%s' is too wordy."
+ignorecase: true
+level: warning
+tokens:
+  - a number of
+  - abundance
+  - accede to
+  - accelerate
+  - accentuate
+  - accompany
+  - accomplish
+  - accorded
+  - accrue
+  - acquiesce
+  - acquire
+  - additional
+  - adjacent to
+  - adjustment
+  - admissible
+  - advantageous
+  - adversely impact
+  - advise
+  - aforementioned
+  - aggregate
+  - aircraft
+  - all of
+  - all things considered
+  - alleviate
+  - allocate
+  - along the lines of
+  - already existing
+  - alternatively
+  - amazing
+  - ameliorate
+  - anticipate
+  - apparent
+  - appreciable
+  - as a matter of fact
+  - as a means of
+  - as far as I'm concerned
+  - as of yet
+  - as to
+  - as yet
+  - ascertain
+  - assistance
+  - at the present time
+  - at this time
+  - attain
+  - attributable to
+  - authorize
+  - because of the fact that
+  - belated
+  - benefit from
+  - bestow
+  - by means of
+  - by virtue of
+  - by virtue of the fact that
+  - cease
+  - close proximity
+  - commence
+  - comply with
+  - concerning
+  - consequently
+  - consolidate
+  - constitutes
+  - demonstrate
+  - depart
+  - designate
+  - discontinue
+  - due to the fact that
+  - each and every
+  - economical
+  - eliminate
+  - elucidate
+  - employ
+  - endeavor
+  - enumerate
+  - equitable
+  - equivalent
+  - evaluate
+  - evidenced
+  - exclusively
+  - expedite
+  - expend
+  - expiration
+  - facilitate
+  - factual evidence
+  - feasible
+  - finalize
+  - first and foremost
+  - for all intents and purposes
+  - for the most part
+  - for the purpose of
+  - forfeit
+  - formulate
+  - have a tendency to
+  - honest truth
+  - however
+  - if and when
+  - impacted
+  - implement
+  - in a manner of speaking
+  - in a timely manner
+  - in a very real sense
+  - in accordance with
+  - in addition
+  - in all likelihood
+  - in an effort to
+  - in between
+  - in excess of
+  - in lieu of
+  - in light of the fact that
+  - in many cases
+  - in my opinion
+  - in order to
+  - in regard to
+  - in some instances
+  - in terms of
+  - in the case of
+  - in the event that
+  - in the final analysis
+  - in the nature of
+  - in the near future
+  - in the process of
+  - inception
+  - incumbent upon
+  - indicate
+  - indication
+  - initiate
+  - irregardless
+  - is applicable to
+  - is authorized to
+  - is responsible for
+  - it is
+  - it is essential
+  - it seems that
+  - it was
+  - magnitude
+  - maximum
+  - methodology
+  - minimize
+  - minimum
+  - modify
+  - monitor
+  - multiple
+  - necessitate
+  - nevertheless
+  - not certain
+  - not many
+  - not often
+  - not unless
+  - not unlike
+  - notwithstanding
+  - null and void
+  - numerous
+  - objective
+  - obligate
+  - obtain
+  - on the contrary
+  - on the other hand
+  - one particular
+  - optimum
+  - overall
+  - owing to the fact that
+  - participate
+  - particulars
+  - pass away
+  - pertaining to
+  - point in time
+  - portion
+  - possess
+  - preclude
+  - previously
+  - prior to
+  - prioritize
+  - procure
+  - proficiency
+  - provided that
+  - purchase
+  - put simply
+  - readily apparent
+  - refer back
+  - regarding
+  - relocate
+  - remainder
+  - remuneration
+  - requirement
+  - reside
+  - residence
+  - retain
+  - satisfy
+  - shall
+  - should you wish
+  - similar to
+  - solicit
+  - span across
+  - strategize
+  - subsequent
+  - substantial
+  - successfully complete
+  - sufficient
+  - terminate
+  - the month of
+  - the point I am trying to make
+  - therefore
+  - time period
+  - took advantage of
+  - transmit
+  - transpire
+  - type of
+  - until such time as
+  - utilization
+  - utilize
+  - validate
+  - various different
+  - what I mean to say is
+  - whether or not
+  - with respect to
+  - with the exception of
+  - witnessed
diff --git a/.vale/styles/write-good/Weasel.yml b/.vale/styles/write-good/Weasel.yml
new file mode 100644
index 000000000..e29391444
--- /dev/null
+++ b/.vale/styles/write-good/Weasel.yml
@@ -0,0 +1,207 @@
+extends: existence
+message: "'%s' is a weasel word!"
+ignorecase: true
+level: warning
+tokens:
+  - absolutely
+  - accidentally
+  - additionally
+  - allegedly
+  - alternatively
+  - angrily
+  - anxiously
+  - approximately
+  - awkwardly
+  - badly
+  - barely
+  - beautifully
+  - blindly
+  - boldly
+  - bravely
+  - brightly
+  - briskly
+  - bristly
+  - bubbly
+  - busily
+  - calmly
+  - carefully
+  - carelessly
+  - cautiously
+  - cheerfully
+  - clearly
+  - closely
+  - coldly
+  - completely
+  - consequently
+  - correctly
+  - courageously
+  - crinkly
+  - cruelly
+  - crumbly
+  - cuddly
+  - currently
+  - daily
+  - daringly
+  - deadly
+  - definitely
+  - deliberately
+  - doubtfully
+  - dumbly
+  - eagerly
+  - early
+  - easily
+  - elegantly
+  - enormously
+  - enthusiastically
+  - equally
+  - especially
+  - eventually
+  - exactly
+  - exceedingly
+  - exclusively
+  - extremely
+  - fairly
+  - faithfully
+  - fatally
+  - fiercely
+  - finally
+  - fondly
+  - few
+  - foolishly
+  - fortunately
+  - frankly
+  - frantically
+  - generously
+  - gently
+  - giggly
+  - gladly
+  - gracefully
+  - greedily
+  - happily
+  - hardly
+  - hastily
+  - healthily
+  - heartily
+  - helpfully
+  - honestly
+  - hourly
+  - hungrily
+  - hurriedly
+  - immediately
+  - impatiently
+  - inadequately
+  - ingeniously
+  - innocently
+  - inquisitively
+  - interestingly
+  - irritably
+  - jiggly
+  - joyously
+  - justly
+  - kindly
+  - largely
+  - lately
+  - lazily
+  - likely
+  - literally
+  - lonely
+  - loosely
+  - loudly
+  - loudly
+  - luckily
+  - madly
+  - many
+  - mentally
+  - mildly
+  - monthly
+  - mortally
+  - mostly
+  - mysteriously
+  - neatly
+  - nervously
+  - nightly
+  - noisily
+  - normally
+  - obediently
+  - occasionally
+  - only
+  - openly
+  - painfully
+  - particularly
+  - patiently
+  - perfectly
+  - politely
+  - poorly
+  - powerfully
+  - presumably
+  - previously
+  - promptly
+  - punctually
+  - quarterly
+  - quickly
+  - quietly
+  - rapidly
+  - rarely
+  - really
+  - recently
+  - recklessly
+  - regularly
+  - remarkably
+  - relatively
+  - reluctantly
+  - repeatedly
+  - rightfully
+  - roughly
+  - rudely
+  - sadly
+  - safely
+  - selfishly
+  - sensibly
+  - seriously
+  - sharply
+  - shortly
+  - shyly
+  - significantly
+  - silently
+  - simply
+  - sleepily
+  - slowly
+  - smartly
+  - smelly
+  - smoothly
+  - softly
+  - solemnly
+  - sparkly
+  - speedily
+  - stealthily
+  - sternly
+  - stupidly
+  - substantially
+  - successfully
+  - suddenly
+  - surprisingly
+  - suspiciously
+  - swiftly
+  - tenderly
+  - tensely
+  - thoughtfully
+  - tightly
+  - timely
+  - truthfully
+  - unexpectedly
+  - unfortunately
+  - usually
+  - very
+  - victoriously
+  - violently
+  - vivaciously
+  - warmly
+  - waverly
+  - weakly
+  - wearily
+  - weekly
+  - wildly
+  - wisely
+  - worldly
+  - wrinkly
+  - yearly
diff --git a/.vale/styles/write-good/meta.json b/.vale/styles/write-good/meta.json
new file mode 100644
index 000000000..a115d2886
--- /dev/null
+++ b/.vale/styles/write-good/meta.json
@@ -0,0 +1,4 @@
+{
+  "feed": "https://github.com/errata-ai/write-good/releases.atom",
+  "vale_version": ">=1.0.0"
+}
diff --git a/.vale/vale.d/concepts.ini b/.vale/vale.d/concepts.ini
new file mode 100644
index 000000000..3cb20230c
--- /dev/null
+++ b/.vale/vale.d/concepts.ini
@@ -0,0 +1,12 @@
+StylesPath = ../styles
+
+Vocab = Apertis
+
+IgnoredScopes = code, tt, link
+
+[*.md]
+BasedOnStyles = Vale
+
+Vale.Spelling = NO
+
+BlockIgnores = (?s) *({{< [^>]* >}})
diff --git a/.vale/vale.ini b/.vale/vale.ini
new file mode 100644
index 000000000..7a0bad339
--- /dev/null
+++ b/.vale/vale.ini
@@ -0,0 +1,18 @@
+StylesPath = styles
+
+Vocab = Apertis
+
+IgnoredScopes = code, tt, link
+
+[*.md]
+BasedOnStyles = Vale, write-good
+
+Vale.Spelling = NO
+
+# Too many false positives:
+write-good.TooWordy = NO
+
+# Covered by Vale.Repetition:
+write-good.Illusions = NO
+
+BlockIgnores = (?s) *({{< [^>]* >}})
diff --git a/scripts/vale-to-codeclimate b/scripts/vale-to-codeclimate
new file mode 100755
index 000000000..b1247a61d
--- /dev/null
+++ b/scripts/vale-to-codeclimate
@@ -0,0 +1,33 @@
+#!/usr/bin/jq -fs
+
+.[] |
+to_entries | [
+    .[] |
+    .value[] + {filename: .key} |
+    {
+        type: "issue",
+        check_name: .Check,
+        categories: ["Style"],
+        description: .Message,
+        severity: .Severity |
+            gsub("suggestion"; "info") |
+            gsub("warning"; "minor") |
+            gsub("error"; "major"),
+        fingerprint: (
+            [.Check, .filename, .Span[1] - .Span[0], .Message] + .Span | join(",")
+        ),
+        location: {
+            path: .filename,
+            positions: {
+                begin: {
+                    line: .Line,
+                    column: .Span[0]
+                },
+                end: {
+                    line: .Line,
+                    column: .Span[1]
+                }
+            }
+        }
+    }
+]
-- 
GitLab